次のようなコードが少しあるとします。
if(someInteger || somecomplexfunction() > 0) {
// do something
}
someInteger
true と評価された場合、関数は呼び出されますか?
ps で GCC を使用してコンパイルする-O2
次のようなコードが少しあるとします。
if(someInteger || somecomplexfunction() > 0) {
// do something
}
someInteger
true と評価された場合、関数は呼び出されますか?
ps で GCC を使用してコンパイルする-O2
いいえ、そうはなりません。C の論理演算子はショート サーキットです。そのため、an の左側||
が true の場合、右側は評価されません (したがって、関数は実行されず、実行される可能性のある副作用はありません)。と同様に&&
、左側が false と評価された場合、右側は評価されません。
これは C 標準で定義されており、コンパイル オプションに関係なく、標準準拠のコンパイラで発生します。
これによりパフォーマンスが向上することもありますが、これはコンパイラが選択する最適化ではなく、C のセマンティクスに根付いたものです。