意外に知られていない && と || の短絡評価

またまた専門学校で出た話題です。さらに、実は最近専門学校以外でも講義を行っているのですが、そこでも話題になりました。C言語を一通り習いました(さらには、C++やC#なども習いました)という生徒であっても、意外に知らないのが && や || の短絡評価です。

ちょっと入門サイトをいくつか調べてみましたが、確かに短絡評価に触れているところは見当たりませんでした。皆無ではないでしょうが、初心者が短絡評価を知る機会はそう多くないようです。しかし、短絡評価は初心者だから知らなくてもよいというようなものではなく、これを知らなければまともな条件式は書けないはずです。

それでは、JIS X3010:2003の「6.5.13 論理AND演算子」から、該当部分を引用してみましょう。

 ビット単位の2項 & 演算子と異なり,&& 演算子は左から右への評価を保証する。第一オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と比較して等しい場合,第2オペランドは評価しない。

つまり,&& の左辺が偽であれば,右辺は評価されずに条件式全体の評価結果が決まることになります。右辺に副作用を伴う式がある場合、左辺の結果次第では実行されなくなるため、思わぬ不具合につながります(右辺に副作用を伴う式を書いてはいけないのではなく、動作をきちんと理解すべきだということです)。

ついでに、「6.5.14 論理OR演算子」の該当部分も引用してみます。

 ビット単位の | 演算子と異なり,|| 演算子は左から右への評価を保証する。第一オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と比較して等しくない場合,第2オペランドは評価しない。

こちらは、|| の左辺が真であれば、右辺が評価されないことになります。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/484