if文の中にカンマが存在する – プログラミング – Home

if文の中にカンマが存在する
 
通知
すべてクリア

[解決済] if文の中にカンマが存在する


パズ
 パズ
(@パズ)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

こんにちは。いつもお世話になっております。
Win2000SP4、VC++6SP5 の環境で開発をしております。

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

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

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

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

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


引用未解決
トピックタグ
とおり
 とおり
(@とおり)
ゲスト
結合: 22年前
投稿: 43
 

,(カンマ)演算子を調べて下さい。立派な言語仕様です。
↑のコードの意図は不明ですが…


返信引用
パズ
 パズ
(@パズ)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

とおりさん、ご返答ありがとうございます。

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

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

ifがなくても、

式1, 式2;

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

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

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


返信引用
パズ
 パズ
(@パズ)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

tibさん、ありがとうございます。

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

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

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


返信引用
とおり
 とおり
(@とおり)
ゲスト
結合: 22年前
投稿: 43
 

なんか解決になっちゃってますけど、カンマ演算子の正しい情報は得られたのでしょうか。

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

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

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


返信引用
とおり
 とおり
(@とおり)
ゲスト
結合: 22年前
投稿: 43
 

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

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


返信引用
パズ
 パズ
(@パズ)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

とおりさん、ご返答ありがとうございます。

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> ・セミコロン;的な意味をもち、順次処理を実行したい場合に使用する。

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

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

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

int i = (1, 2);

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

まあ確かに調べりゃわかることではありますけど、コンマが演算子にならない文脈もあるので
その辺要注意かもしれません。

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


返信引用
774
 774
(@774)
ゲスト
結合: 20年前
投稿: 2
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました