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