【问题标题】:Does GCC do lazy evaluation by default? [duplicate]GCC 默认会做惰性求值吗? [复制]
【发布时间】:2014-08-24 14:12:38
【问题描述】:

我需要检查node->next != NULL,我不知道我是否可以写:

if(node!= NULL && node->next!= NULL)

【问题讨论】:

  • 这通常称为“短路评估”
  • 这不是懒惰的评估。是的,除非你的编译器坏了,否则你可以编写它。
  • @juanchopanza 尤达!不要害怕。没有太多编译器损坏。这个功能用的很频繁,到处都能看到。

标签: c++ gcc short-circuiting


【解决方案1】:

是的,这是 C/C++ 的保证行为,正如 in this question 所描述的那样。

作为补充:在 C/C++ 中,这被称为短路评估,而不是惰性评估。

【讨论】:

    【解决方案2】:

    这与 GCC 无关;评估顺序和短路由语言标准保证。以下是 C++11 标准草案 N3337 的相关部分(重点是我的):

    5.14 逻辑与运算符

    1. && 运算符从左到右分组。操作数都根据上下文转换为 bool 类型。如果两个操作数都为真,则结果为真,否则为假。与 & 不同,&& 保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数
    2. 结果是布尔值。如果对第二个表达式求值,则与第一个表达式关联的每个值计算和副作用都会在与第二个表达式关联的每个值计算和副作用之前进行排序。

    5.15 逻辑或运算符

    1. ||运算符组从左到右。操作数都根据上下文转换为布尔值。如果其中一个操作数为真,则返回真,否则返回假。与 | 不同,||保证从左到右的评估;此外,如果第一个操作数的计算结果为 true,则不会计算第二个操作数。
    2. 结果是布尔值。如果对第二个表达式求值,则与第一个表达式关联的每个值计算和副作用都会在与第二个表达式关联的每个值计算和副作用之前进行排序。

    任何符合标准的编译器都应该这样做。所以,是的,GCC 也这样做。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2014-02-28
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2013-05-13
      • 2014-11-13
      相关资源
      最近更新 更多