【问题标题】:Order of logical OR execution in CC中逻辑或执行的顺序
【发布时间】:2013-01-10 13:13:14
【问题描述】:

想知道如果 next 的值为 NULL(节点是链表),下一条语句是否会导致保护错误和其他可怕的事情。

if (!node->next || node->next->some_field != some_value) {

我假设一旦第一部分为真,OR 的第二部分就不会被评估。我假设这个错了吗?这个编译器是特定的吗?

【问题讨论】:

  • 你没有错。 if(ptr && ptr->foo == bar) 也很安全。它实际上是许多程序员每天都在使用的代码模式。
  • 这被称为“短路评估”,如果您需要一个词来搜索。

标签: c


【解决方案1】:

在 ISO-IEC-9899-1999 标准 (C99) 的第 6.5.14 节中:

||如果任一操作数比较不相等,则运算符应产生 1 为 0;否则,它产生 0。结果具有 int 类型。 4 不同于 按位 |运算符,||运算符保证从左到右的评估; 在计算第一个操作数之后有一个序列点。 如果第一个操作数比较不等于 0,则第二个操作数不 评估。

这不是特定于编译器的。如果node->nextNULL,则条件的其余部分从不求值。

【讨论】:

  • 这当然也存在于 C89/C90 中(第 6.3.14 节(ISO 编号)),文本相同。在取代 C99 作为当前 C 标准的 ISO/IEC 9899:2011 (C11) 中,措辞略有不同,但传达的信息相同。
【解决方案2】:

在 OR 中,

if ( expr_1 || expr_2)

expr_2 只有在 expr_1 失败时才被“测试”(为假)

在 AND 中

if( expr_1 && expr_2 )

expr_2 只有在 expr_1 成功时才被“测试”(为真)

【讨论】:

    【解决方案3】:

    可以安全地假设,如果左侧的计算结果为 true,则不会计算右侧的布尔表达式。见relevant question

    【讨论】:

      【解决方案4】:

      它不是特定于编译器的。您可以放心地依赖短路,您的代码将按预期工作。

      【讨论】:

        【解决方案5】:

        你是对的。

        它是compiler independent 并且总是在OR 运算符(!node->next) 之前的first 条件在评估second 条件(node->next->some_field != some_value) 之后在OR 运算符之后进行评估。如果first 条件为true,则整个expression 仅计算为true,而不计算second 条件。

        您只是在为您的linked list 充分利用此功能。只有当not NULLnext 指针时,您才能进一步访问它。

        【讨论】:

          猜你喜欢
          • 2010-09-05
          • 2013-06-13
          • 1970-01-01
          • 2016-01-31
          • 2012-01-10
          • 1970-01-01
          • 2011-05-12
          • 2014-03-21
          • 2022-06-15
          相关资源
          最近更新 更多