让我们来看看这个C代码示例:
int ID = 0;
if( (Check(&ID) == ERROR)
||(ID == -1)
){
return ERROR;
}
在 (Check(&ID) == ERROR)
之前,您有保证(ID == -1)
检查 吗?
(ID = -1
将是一个错误状态,由函数Check
设置)
答案 0 :(得分:2)
是的,你这样做。对于x || y
形式的表达式,y
仅在x
求值为0时进行求值。
这称为 short-circutting ,也适用于&&
。
你的括号也是多余的:同样适用于等价物(在我看来,更清楚)
if (Check(&ID) == ERROR || ID == -1)
答案 1 :(得分:1)
是的,因为评估||
运算符的第一个和第二个操作数之间存在序列点。
N1570 5.1.2.3程序执行,第3段说:
序列点的存在 表达式A和B的评估之间意味着每个值的计算和 在每个值计算和副作用之前,对与A相关的副作用进行排序 与B相关联。
N1570 6.5.14逻辑OR运算符,第4段说:
与按位|不同运算符,||运营商保证从左到右的评估;如果 评估第二个操作数,在第一个操作数的评估之间有一个序列点 和第二个操作数。如果第一个操作数比较不等于0,则第二个操作数为 没有评估。