if文の中にカンマが存在する

[戻る]
パズ 2005/09/03(土) 15:20:55
こんにちは。いつもお世話になっております。
Win2000SP4、VC++6SP5 の環境で開発をしております。

現在、他社が開発していたソースコードを引き継ぎメンテ作業をしております。
その際、次のようなコードが存在しました。(簡単な例に置き換えています)

---------------------------------------
#include <stdio.h>

int main(){
    if(1, 0){
        printf("真\n");
    }
    else{
        printf("偽\n");
    }
    return 0;
}
---------------------------------------

私はこのようなif文の使用法を知りませんでした。
上記のコードを実行しますと、"偽"が出力されます。
if文が「if(1,1)」ですと、"真"が出力されます。
カンマ区切りの最後の条件で真偽が判定されていると思われます。

このようなコードがコンパイルできることがまず驚きでした。
このような使用法は言語仕様的に認められているのでしょうか?

とおり 2005/09/03(土) 15:30:47
,(カンマ)演算子を調べて下さい。立派な言語仕様です。
↑のコードの意図は不明ですが…

パズ 2005/09/03(土) 15:49:16
[[解決]]
とおりさん、ご返答ありがとうございます。

自分の調べ方が悪いのか、,(カンマ)演算子について情報が見つかりませんでした。

確かに提示させていただいたコードの意図は不明ですね^^;
実際は、関数呼び出しがあり、次のようなコードになっています。
-------------------------------------
if(n = func(), n < 0)
-------------------------------------

C言語のif文の言語仕様で、
if(式1, 式2)
とあった場合、式1を実行した後に、式2が評価されるということですかね。
勉強不足でした。。

tib 2005/09/03(土) 16:05:41
ifがなくても、

式1, 式2;

と書く事で、式1と式2が実行されます。ただし、カンマ演算子は文の区切りとはなりません。

私は以前、
 if( ... )
 {
  x=○○;
  y=××;
 }
というのを、行数をケチるために
 if( ... )  x=○○, y=××;
という風に書いていました。デバッガでステップ実行していると不便な事があるので今は
こんな書き方はしていませんが。

if( n=func(), n<0 ) は当然、
if( (n=func()) < 0 ) と等価ですが、
これを書いた方は、カッコが少ない分すっきり見えていいんじゃない? と思ったのでしょ
うね。

パズ 2005/09/03(土) 16:25:22
tibさん、ありがとうございます。

>ifがなくても、
>
>式1, 式2;
>
>と書く事で、式1と式2が実行されます。ただし、カンマ演算子は文の区切りとはなりません。
なるほど、たしかにif文にかぎった話ではないですね。
危うく間違った知識になるところでした。

>if( n=func(), n<0 ) は当然、
>if( (n=func()) < 0 ) と等価ですが、
そうなんですよね。。

勉強になりました。
ありがとうございました。

とおり 2005/09/03(土) 17:42:36
なんか解決になっちゃってますけど、カンマ演算子の正しい情報は得られたのでしょうか。

>なるほど、たしかにif文にかぎった話ではないですね。

式1, 式2
がどういう値を持つか理解しましたか?
以下のif文を正しく解釈できますか?

if ( n = func(), n < 0, n > 0 )

とおり 2005/09/03(土) 17:45:00
>自分の調べ方が悪いのか、,(カンマ)演算子について情報が見つかりませんでした。

というか、調べてないに1票。
そのままググるだけで、1発でしかも大量にヒットしますが。

パズ 2005/09/03(土) 19:24:01
とおりさん、ご返答ありがとうございます。

重要なヒントをいただいたのに、大変失礼しました。
if文にとらわれていたため、調べ方(キーワード)が検討違いだったようです。
確か「C言語 if文 ,」で行いました。。

再度、「カンマ演算子」で調査し、カンマ演算子に関して理解できました。
・セミコロン";"的な意味をもち、順次処理を実行したい場合に使用する。
・if文で使用した場合は、最後(一番右側)の処理が真偽の判定対象になる。

ありがとうございました。
失礼をお許しください。

シャノン 2005/09/03(土) 23:56:04
> ・セミコロン";"的な意味をもち、順次処理を実行したい場合に使用する。

セミコロン的な意味はありません。
カンマは文の区切りではなく演算子ですから、カンマを含んでセミコロンまでがひとつ
の文です。

> ・if文で使用した場合は、最後(一番右側)の処理が真偽の判定対象になる。

if に限った話ではありません。
カンマ演算子の結果は、右側の値です。
例えば、

int i = (1, 2);

i の値は? 2になることはわかりますか?

tetrapod 2005/09/05(月) 09:03:52
まあ確かに調べりゃわかることではありますけど、コンマが演算子にならない文脈もあるので
その辺要注意かもしれません。

i=++j,j==k; // コンマ演算子の例
func(u+=w, v-=w); // コンマ演算子にならない例
f(a, (t=3, t+2), c); // 両方を使っている例

774 2005/09/05(月) 14:47:02
順次評価演算子ってやつね^^;
自分も調べてみて…初めて知った(ハズィナ)
勉強になったよサンクス。

#自分では使うことは多分ないな
#人のソース解析で出てきそうではあるが。

古いスレッドには追加発言できません。