为了账号安全,请及时绑定邮箱和手机立即绑定

是否要求短路逻辑运营商?和评估顺序?

是否要求短路逻辑运营商?和评估顺序?

C++ C
拉莫斯之舞 2019-05-28 17:52:41
是否要求短路逻辑运营商?和评估顺序?ANSI标准是否要求逻辑运算符在C或C ++中被短路?我很困惑,因为我记得K&R的书说你的代码不应该依赖于这些操作被短路,因为它们可能没有。有人可以指出标准中的哪个位置逻辑操作始终是短路的吗?我最感兴趣的是C ++,C的答案也很棒。我还记得读(不记得在哪里)评估顺序没有严格定义,所以你的代码不应该依赖或假设表达式中的函数将按特定的顺序执行:在语句的末尾所有引用的函数将被调用,但编译器可以自由选择最有效的顺序。标准是否表明该表达式的评估顺序?if( functionA() && functionB() && functionC() ) cout<<"Hello world";
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

是的,它要求(评估顺序和短路)。在您的示例中,如果所有函数都返回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 cint 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,否则为false。与&不同,&&保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

并在5.15/1

|| 操作员组从左到右。操作数都隐式转换为bool(第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)中运算符的内置含义,在评估第一个表达式后有一个序列点。


查看完整回答
反对 回复 2019-05-28
  • 3 回答
  • 0 关注
  • 668 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信