C言語関係掲示板

過去ログ

No.1038 論理演算子は偽となった時点で打ち切られる

[戻る] [ホームページ]
No.13347

論理演算子についてのご質問
投稿者---ROXY(2004/03/26 11:34:47)


お世話になっております。以下のソースについてずっと考えてみたの
ですが、悲しいことに理解できません。
どなたか御教授くださいますようお願い申しあげます。

int ans, a = 0, b = 0, c = 0, d = 0;

d = ( ( a = 4 ) > 3) && ( ( b = 1 ) == 0 ) && ( ( c = 2 ) == 2);

ans = a + b + c + d;
---------------------------
で、ans = 5,となり変数cが0となります。
d = 真 && 偽 && 真と思い、d = 0でa,b,cにはそれぞれ値が代入される
と思っていたのですが、cにだけ値が入らないのはなぜなのでしょうか?


No.13349

Re:論理演算子についてのご質問
投稿者---tetrapod(2004/03/26 11:45:37)


&& や || 演算子は、演算子の左→右の順に評価します。
しかし、左側の値が偽(真)になった時点で、右側の評価は打ち切られます。

>d = ( ( a = 4 ) > 3) && ( ( b = 1 ) == 0 ) && ( ( c = 2 ) == 2);
(b=1)==0 は偽なので、その時点で && 演算の結果は偽と定まってしまいます。
そのため2個目の && の右側部分式 (c=2)==2 は評価(実行)されません。
よって a=4, b=1, c=0, d=0 となるわけです。

この性質があるため、たとえば char *p; があるとき
if (p && *p) のような式を書いても問題ありません。

# 自分の質問に「ご」をつけるのは日本語がおかしいような気が...


No.13350

(訂正)Re:論理演算子についての質問
投稿者---ROXY(2004/03/26 12:53:45)


ありがとうございました。
そういうことだったのですね。
偽となった時点で、打ち切られるとは・・・。
知りませんでした。

No.13352

Re:(訂正)Re:論理演算子についての質問
投稿者---tetrapod(2004/03/26 13:50:09)


>偽となった時点で、打ち切られるとは・・・。
そのとおりです。左辺から評価していき、左辺の評価結果が
&& の場合は偽になった時点
|| の場合は真になった時点、で打ち切り、右辺は評価されません。

# http://www9.plala.or.jp/sgwr-t/c/sec06-1.html に記述が無いですね。

補足: && と || の左辺が評価完了した時点に副作用完了点もあります。

しかし & と | の場合は話が違うので注意してください。