是的,它要求按照给定的顺序进行函数调用并且采用短路逻辑。在你的例子中,如果所有函数都返回 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)
请注意,逗号运算符不应与用于分隔事物的语法逗号混淆:
// order of calls to a and b is unspecified!
function(a(), b());
C++标准在5.14/1中指出:
&& 运算符从左到右分组。这两个操作数都会隐式转换为类型 bool(第4条款)。如果两个操作数都为 true,则结果为 true,否则为 false。与 & 不同,&& 保证从左到右进行求值:如果第一个操作数为 false,则不会评估第二个操作数。
而在 5.15/1 中:
|| 运算符从左到右分组。这两个操作数都将隐式转换为 bool 类型(第 4 条款)。如果其任一操作数为 true,则返回 true,否则返回 false。与 | 不同,|| 保证从左到右进行求值;此外,如果第一个操作数的求值结果为 true,则不会评估第二个操作数。
对于这两者接下来都有所描述:
结果是布尔值。第一个表达式的所有副作用(除了临时对象的销毁)发生在第二个表达式被计算之前。
此外,1.9/18 表示:
在每个表达式的求值中,使用这些表达式中运算符的内置意义(5.14、5.15、5.16、5.18),在第一个表达式的求值后存在一个序列点。