はい、それが義務付けられています(評価順序と短絡の両方)。あなたの例では、すべての関数が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());
一つは、左と右のオペランドの間言い&&
、||
、,
との第一及び第二/第三のオペランドの間の?:
「配列点」である(条件演算子)。副作用はそのポイントの前に完全に評価されます。したがって、これは安全です:
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)で演算子の組み込みの意味を使用すると、最初の式の評価の後にシーケンスポイントがあります。