【问题标题】:Explain the logic [closed]解释逻辑[关闭]
【发布时间】:2017-10-06 13:31:19
【问题描述】:
  #include <stdio.h>
 //Compiler version gcc 6.3.0

 int main(void)
 {
    int i=10, j=2, k=0, m;
    m=++i || ++j && ++k;
    printf("%d,%d,%d,%d",i,j,k,m);
 }

谁能解释一下逻辑,输出是11,2,0,1

【问题讨论】:

  • 您是否尝试过在纸上阅读?你知道“短路评估”吗?
  • @Caleb 一点也不,这里的一切都是有序和明确的。
  • @Caleb 此代码定义明确,UB 或序列点没有问题。

标签: c logical-operators logical-or


【解决方案1】:

由于此表达式语句的操作优先级

m=++i || ++j && ++k;

等价于

m = ++i || ( ++j && ++k );

你可以想象成这样

m = expression1 || expression2;

其中expression1++iexpression2( ++j &amp;&amp; ++k )

根据 C 标准(6.5.14 逻辑或运算符)

4 不同于按位 |运算符,||运营商保证 从左到右的评估;如果计算第二个操作数,则有 第一个和第二个评估之间的序列点 操作数。 如果第一个操作数比较不等于 0,则第二个 不计算操作数

由于 expression1 比较不等于 0(其值等于 11),因此不会评估 expression2

因此只有expression1被评估并且不等于0。

根据 C 标准同一部分的另一个引用

3 ||如果其任一操作数比较,运算符 将产生 1 不等于0;否则,它产生 0。结果的类型为 int。

右边的求值结果等于 1 赋值给变量m

因此只有变量im 被更改。变量 jk 未更改,因为它们作为操作数存在的表达式未计算。

【讨论】:

    【解决方案2】:

    i 从 10 开始,但在测试之前递增到 11。

    m 被分配了一个布尔结果,所以将是 0 或 1。

    i 不为零,因此对于布尔表达式的计算结果为真,因此,|| 之后的表达式不需要评估,因为 ||是一个布尔短路评估器。

    因此你的输出。

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2021-10-17
      • 2018-12-07
      相关资源
      最近更新 更多