- ベストアンサー
C言語におけるif文の評価順
たとえば以下のようなif文で、A B C が評価される順番は 言語の規約上、明確になっているのでしょうか? if ( A && B && C ) { } また例えば A, B, C の順番に評価されるとして、B が FALSE の場合は C を評価する必要はありませんが、 この場合、Cは評価されないことは言語規約上、明確に なっているのでしょうか? 手元のコンパイラで試した結果では 評価順は A -> B -> C で B で FALSE を返すようにしたら C は実行されませんでした。 ただ、これが実装依存か、言語の標準仕様かという点が 気になっています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
「A,B,Cの順に評価され、AがFALSEならB,Cは評価されず、AがTRUEでBがFALSEならCは評価されない」が標準仕様です。 論理AND演算子、論理OR演算子は左から右に評価され、第1オペランドだけで値が決定すると、第2オペランドの評価は行われません。 http://www.microsoft.com/japan/developer/library/vclang/_clang_c_sequence_points.htm http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide27-1.html http://www.st.rim.or.jp/~phinloda/cqa/cqa10.html#Q14
その他の回答 (6)
- hpsk
- ベストアンサー率40% (48/119)
> 逆にこれら以外は(最適化とは無関係に)不定となっています. ","演算子も左から評価されると規定されています。 ただし同じ","でも、関数の引数の評価順序は規定されていませんのでご注意を。たとえば、 f( g(x), (t=2, t+3), h(x) ); で、第2引数は必ず5になりますが、 gとhのどちらが先に呼び出されるかはわかりません。
- Tacosan
- ベストアンサー率23% (3656/15482)
オペランドの評価順序が決まっている演算子は &&, || (第1オペランド→第2オペランドの順で, 第1オペランドで値が決まるなら第2オペランドは評価しない) と ?: (第1オペランド→第2オペランドまたは第3オペランドの順) だけで, 逆にこれら以外は(最適化とは無関係に)不定となっています.
- hpsk
- ベストアンサー率40% (48/119)
ちょっと気になったので投稿させていただきます。 > 順序をかえる場合があります。 確かに、意味が変わらない範囲内で「内部的には」実は評価の順序が変わっている、というのは今回の件に限らず最適化では普通にあることですが、 今回の話は、No.1~No.3の方の答えられたような順序で評価をしているように「外部からは」見えるという話であって、最適化による評価順序の変更とは切り分けたほうがよいように思います。
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
みなさんは、a,b,cの順に評価するとかかれていますが 実は、昔、古いコンパイラ等では、強力な最適化を 実現するために、同じ結果になることが確定された 場合、順序をかえる場合があります。 例えば・・・・Z80 (16bitレジスタが3つ)を例にします。 unsigned a,b,c; /* unsigned int */ a=23513; if(a > 20000) { b=15325; if(b>10000) { c=31252; if (a && b && c) { のような場合、実はレジスタ上に残っている数字は b と c と 比較用の 10000 だけになります。 そうすると、最適化する上で、最初に b と c を 最初に比較することで、メモリからの読み出しの分 最適化することができます。
- jacta
- ベストアンサー率26% (845/3158)
#1の方が回答されている通り、「A,B,Cの順に評価され、Aが偽ならB,Cは評価されず、Aが真でBが偽ならCは評価されない」のが標準仕様です。 通常、演算子のオペランドの評価順序は(演算子の優先順位とは関係なく)不定ですが、&&や||演算子等は例外的に評価順序が決められています。 厳密に言えば、||や&&演算では、第一オペランドの評価の直後が副作用完了点となっています。以後、詳しく調べたい場合は「副作用完了点」で調べてみてください。 なお、C++で&&や||演算子を多重定義した場合には、こうした動作にはなりませんので要注意です。
- itita
- ベストアンサー率75% (3/4)
>たとえば以下のようなif文で、A B C が評価される順番は >言語の規約上、明確になっているのでしょうか? はい。「==」、「&&」などは演算子と呼ばれ、 優先順位が決められています。 慣れてくれば演算子の優先順位もある程度わかって きますが、全部覚える必要はないでしょう。 ()で優先順位を明確にするのも一つの手です。 http://www.bohyoh.com/CandCPP/C/operator.html
お礼
多くの回答ありがとうございました。 大変参考になりました。