はい、それが義務付けられています(評価順序と短絡の両方)。あなたの例では、すべての関数が 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
ます。
&& 演算子は左から右にグループ化します。オペランドは両方とも bool 型に暗黙的に変換されます (節 4)。両方のオペランドが true の場合、結果は true になり、それ以外の場合は false になります。& とは異なり、&& は左から右への評価を保証します。最初のオペランドが false の場合、2 番目のオペランドは評価されません。
そしてで5.15/1
:
|| 演算子グループは左から右へ。オペランドは両方とも bool に暗黙的に変換されます (節 4)。オペランドのいずれかが true の場合は true を返し、それ以外の場合は false を返します。|とは異なり、|| 左から右への評価を保証します。さらに、最初のオペランドが true と評価された場合、2 番目のオペランドは評価されません。
それはそれらの隣の両方について言います:
結果はブール値です。一時変数の破壊 (12.2) を除く最初の式のすべての副作用は、2 番目の式が評価される前に発生します。
それに加えて、次のように1.9/18
述べています。
それぞれの式の評価では
a && b
a || b
a ? b : C
a , b
これらの式 (5.14、5.15、5.16、5.18) の演算子の組み込みの意味を使用すると、最初の式の評価の後にシーケンス ポイントがあります。