【问题标题】:C language and operators [duplicate]C语言和运算符[重复]
【发布时间】:2021-08-03 22:12:55
【问题描述】:
#include <stdio.h>

int main()
{
  int i=2;

  if(i==3,4)
  { 
      printf("If block");
  }
  else
  {
      printf("Else block");
  }

  return 0;
}

为什么这段代码返回“If block”?``

【问题讨论】:

  • 3,4应该做什么?
  • if (i==3,4) { ... }i==3; if (4) { ... } 相同
  • 我想你会发现函数是 returning 0。它是 printing "If block",因为表达式 i==3,4 的计算结果为 true。

标签: c if-statement comparison comma-operator


【解决方案1】:

if 语句中的表达式:

(i==3,4)

包含逗号操作符。它评估其左操作数,丢弃其值,然后评估作为其结果的右操作数。该运算符的优先级也低于相等运算符==,因此解析为:

((i==3),4)

所以首先评估i==3。由于i 的值为2,因此比较结果为假,导致i==3 评估为0。该值被丢弃。然后 4 被评估,它成为整个表达式的值。由于该值非零,if 块为真,因此打印“If 块”。

【讨论】:

    【解决方案2】:

    在if语句的条件下

    if(i==3,4)
    

    这里使用了逗号。

    来自 C 标准(6.5.17 逗号运算符)

    2 逗号运算符的左操作数被评估为 void 表达;在它的评估和那个之间有一个序列点 的右操作数。然后评估右操作数;结果 有它的类型和价值

    也就是上面的if语句可以等价写成这样

    if( ( i==3 ), ( 4 ))
    

    因此,根据 C 标准的引用,左操作数 ( i == 3 ) 被评估为 void 表达式,即其结果被丢弃。整个表达式的结果是表达式( 4 ) 的右操作数的值。由于此表达式不等于 0,因此整个条件被评估为逻辑真,并执行 if 语句的子语句。

    【讨论】:

      【解决方案3】:

      "为什么这段代码返回"If block"?``"

      为什么表达式 if(i==3,4) 导致执行流转到真正的分支的解释在其他答案中提供了很好的详细信息。简而言之,它计算第一个操作数并丢弃结果,然后使用第二个操作数作为条件进行计算。

      但是,有些人可能会问这有用吗?

      一种用途是在决定流向哪个分支之前强制side effect

      例如

      if (numeric_read(str, &err), !err) 
      //           ^                 ^ result 'err' of side effect used in if evaluation.
                   ^
      //  causes side effect by call function which assigns value to err.
      

      (credit, in comments.)

      这里的副作用是填充err,然后丢弃第一个参数中调用的逻辑结果。然后使用分配给err 的值来选择分支。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-14
        • 2017-08-04
        • 1970-01-01
        • 2015-09-18
        • 2022-11-03
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        相关资源
        最近更新 更多