こんにちは。いつもお世話になっております。
Win2000SP4、VC++6SP5 の環境で開発をしております。
現在、他社が開発していたソースコードを引き継ぎメンテ作業をしております。
その際、次のようなコードが存在しました。(簡単な例に置き換えています)
---------------------------------------
#include <stdio.h>
int main(){
if(1, 0){
printf(真\n);
}
else{
printf(偽\n);
}
return 0;
}
---------------------------------------
私はこのようなif文の使用法を知りませんでした。
上記のコードを実行しますと、偽が出力されます。
if文が「if(1,1)」ですと、真が出力されます。
カンマ区切りの最後の条件で真偽が判定されていると思われます。
このようなコードがコンパイルできることがまず驚きでした。
このような使用法は言語仕様的に認められているのでしょうか?
,(カンマ)演算子を調べて下さい。立派な言語仕様です。
↑のコードの意図は不明ですが…
とおりさん、ご返答ありがとうございます。
自分の調べ方が悪いのか、,(カンマ)演算子について情報が見つかりませんでした。
確かに提示させていただいたコードの意図は不明ですね^^;
実際は、関数呼び出しがあり、次のようなコードになっています。
-------------------------------------
if(n = func(), n < 0)
-------------------------------------
C言語のif文の言語仕様で、
if(式1, 式2)
とあった場合、式1を実行した後に、式2が評価されるということですかね。
勉強不足でした。。
ifがなくても、
式1, 式2;
と書く事で、式1と式2が実行されます。ただし、カンマ演算子は文の区切りとはなりません。
私は以前、
if( ... )
{
x=○○;
y=××;
}
というのを、行数をケチるために
if( ... ) x=○○, y=××;
という風に書いていました。デバッガでステップ実行していると不便な事があるので今は
こんな書き方はしていませんが。
if( n=func(), n<0 ) は当然、
if( (n=func()) < 0 ) と等価ですが、
これを書いた方は、カッコが少ない分すっきり見えていいんじゃない? と思ったのでしょ
うね。
tibさん、ありがとうございます。
>ifがなくても、
>
>式1, 式2;
>
>と書く事で、式1と式2が実行されます。ただし、カンマ演算子は文の区切りとはなりません。
なるほど、たしかにif文にかぎった話ではないですね。
危うく間違った知識になるところでした。
>if( n=func(), n<0 ) は当然、
>if( (n=func()) < 0 ) と等価ですが、
そうなんですよね。。
勉強になりました。
ありがとうございました。
なんか解決になっちゃってますけど、カンマ演算子の正しい情報は得られたのでしょうか。
>なるほど、たしかにif文にかぎった話ではないですね。
式1, 式2
がどういう値を持つか理解しましたか?
以下のif文を正しく解釈できますか?
if ( n = func(), n < 0, n > 0 )
>自分の調べ方が悪いのか、,(カンマ)演算子について情報が見つかりませんでした。
というか、調べてないに1票。
そのままググるだけで、1発でしかも大量にヒットしますが。
とおりさん、ご返答ありがとうございます。
重要なヒントをいただいたのに、大変失礼しました。
if文にとらわれていたため、調べ方(キーワード)が検討違いだったようです。
確か「C言語 if文 ,」で行いました。。
再度、「カンマ演算子」で調査し、カンマ演算子に関して理解できました。
・セミコロン;的な意味をもち、順次処理を実行したい場合に使用する。
・if文で使用した場合は、最後(一番右側)の処理が真偽の判定対象になる。
ありがとうございました。
失礼をお許しください。
> ・セミコロン;的な意味をもち、順次処理を実行したい場合に使用する。
セミコロン的な意味はありません。
カンマは文の区切りではなく演算子ですから、カンマを含んでセミコロンまでがひとつ
の文です。
> ・if文で使用した場合は、最後(一番右側)の処理が真偽の判定対象になる。
if に限った話ではありません。
カンマ演算子の結果は、右側の値です。
例えば、
int i = (1, 2);
i の値は? 2になることはわかりますか?
まあ確かに調べりゃわかることではありますけど、コンマが演算子にならない文脈もあるので
その辺要注意かもしれません。
i=++j,j==k; // コンマ演算子の例
func(u+=w, v-=w); // コンマ演算子にならない例
f(a, (t=3, t+2), c); // 両方を使っている例
順次評価演算子ってやつね^^;
自分も調べてみて…初めて知った(ハズィナ)
勉強になったよサンクス。
#自分では使うことは多分ないな
#人のソース解析で出てきそうではあるが。