是的,它要求(评估顺序和短路)。在您的示例中,如果所有函数都返回 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 条)。如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。
并在5.15/1
:
|| 运算符组从左到右。操作数都被隐式转换为 bool(第 4 条)。如果其中一个操作数为真,则返回真,否则返回假。与 |、|| 不同 保证从左到右的评估;此外,如果第一个操作数的计算结果为真,则不计算第二个操作数。
它对旁边的两个都说:
结果是一个布尔值。第一个表达式的所有副作用,除了临时变量(12.2)的破坏外,都发生在第二个表达式被计算之前。
除此之外,1.9/18
说
在每个表达式的评估中
a && b
a || b
a ? b : C
a , b
使用这些表达式 (5.14, 5.15, 5.16, 5.18) 中运算符的内置含义,在对第一个表达式求值之后有一个序列点。