はい、演算子 ||
には短絡と評価順序が必要です と &&
C および C++ 標準の両方で。
C++ 標準は次のように述べています (C 標準には同等の節があるはずです):
C++ には追加のトラップがあります:ショートサーキットは NOT しません 演算子をオーバーロードする型に適用 ||
と &&
.
非常に具体的な要件がない限り、通常、これらの演算子を C++ でオーバーロードすることはお勧めしません。あなたはそれを行うことができますが、特にこれらの演算子が、これらの演算子をオーバーロードする型でインスタンス化されたテンプレートを介して間接的に使用されている場合、他の人のコードで期待される動作を壊す可能性があります.
短絡評価と評価の順序は、C と C++ の両方で必須のセマンティック標準です。
そうでなければ、このようなコードは一般的なイディオムではありません
char* pChar = 0;
// some actions which may or may not set pChar to something
if ((pChar != 0) && (*pChar != '\0')) {
// do something useful
}
セクション 6.5.13 論理 AND 演算子 C99 仕様 (PDF リンク) の記述
同様に、セクション 6.5.14 論理 OR 演算子 言う
C++ 標準にも同様の文言があります。このドラフト コピーのセクション 5.14 を確認してください。チェッカーが別の回答で指摘しているように、&&または || をオーバーライドすると、通常の関数呼び出しになるため、両方のオペランドを評価する必要があります。
はい、それが義務付けられています(評価順序と短絡の両方)。あなたの例では、すべての関数が true を返す場合、呼び出しの順序は厳密に functionA、次に functionB、次に functionC です。このように使用されます
if(ptr && ptr->value) {
...
}
コンマ演算子についても同じ:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
&&
の左オペランドと右オペランドの間 、 ||
、 ,
?:
の第 1 オペランドと第 2/第 3 オペランドの間 (条件演算子) は「シーケンス ポイント」です。すべての副作用は、その時点より前に完全に評価されます。したがって、これは安全です:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
コンマ演算子は、物事を区切るために使用される構文上のコンマと混同しないでください:
// order of calls to a and b is unspecified!
function(a(), b());
C++ 標準は 5.14/1
で述べています :
そして 5.15/1
で :
それらの隣の両方について次のように表示されます:
それに加えて 1.9/18
言う