2016-03-27 14 views
1

私のコードを最適化するための簡単な質問があります。if()文の仕組み

bool myfunc(); 

if (false && true && myfunc()) 
{ 
} 

myfunc()と呼ばれますか?結果は確かに知られると

+3

要約:いいえ、それは呼び出されません。 –

+0

いいえ。if条件は、最初のfalseで停止し、他の2つの条件をテストしません。 – Drakes

+0

人。答えは_ANSWER SECTION_ –

答えて

4

&&||は(&&||ためtrueためfalse)、すなわち、評価停止を短絡評価を持っています。そして、それは常に厳密に左から右です。

この場合、コンパイル時に条件がfalseであることが判明し、その後コードに到達できないため、ifステートメントを完全に削除することもできます。

+0

にありますおかげさまで助けを借りてください – harut9

+5

正確には、組み込み論理式だけが短絡セマンティクスを持っています。演算子がオーバーロードされると、式は通常の関数呼び出しになります。 –

8

C++は条件式がshort-circuit evaluationであるため、最初のfalseは式全体をfalseにするため、関数は呼び出されません。

注文を変更すると、最初に関数呼び出し(つまり、myfunc() && false && true)を入力すると、その関数が呼び出されます。式の結果は、myfuncが返っても、まだfalseになります。

+0

あなたの答えのように注文書を書く場合、コンパイラはif文全体とそのスコープ内のすべてを最適化しませんか?または、そこに例外がある場合は関数を呼び出しますか? – Chiel

+2

@Chiel関数が別の翻訳単位の外部関数である場合、コンパイラはその関数やその副作用を知ることができないので、関数呼び出しを最適化することはできません。それが最適化できるのは、呼び出し以外は何もしないで、戻り値を無視するということです。 –

1

いいえ、myfunc()は、最初のfalseのために呼び出されません。コンパイラはそこで停止します。短絡評価と呼ばれています。