【问题标题】:What should be the value of b in the following code snippet and why? '-6' or '-7' [duplicate]以下代码片段中 b 的值应该是多少,为什么? '-6' 或 '-7' [重复]
【发布时间】:2019-10-12 19:04:32
【问题描述】:

我想看看四个变量的值(基本上是检查逻辑运算符的优先顺序)。

#include<stdio.h>
int main()
{
    int a=0, b=-7, c=0, d;
    d = ++c || ++a && ++b  ;
    printf("\n %d %d %d %d",a,b,c,d);
}

我希望结果是“0 -6 1 1”,但实际输出是“0 -7 1 1”。任何人都可以在显示的输出背后给出解释吗?

【问题讨论】:

    标签: c


    【解决方案1】:

    先看看Operator Precedence

    然后,关于逻辑 OR 运算符的工作,来自C11,第 §6.5.14 章(强调我的

    [...] || 运算符保证从左到右的评估;如果 第二个操作数被求值,第一个求值之间有一个序列点 和第二个操作数。 如果第一个操作数比较不等于 0,则第二个操作数为 未评估。

    关于结果:

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

    所以,在你的代码中

     d = ++c || ++a && ++b  ;
    

    相同
     d = (++c) || (++a && ++b);
    

    计算结果为

     d = 1 || (++a && ++b);         // short circuit, RHS not evaluated
    

    终于和

    一样了
    d = 1;  // 1 is not the value computation of `++c`, rather result of the `||` operation.
    

    【讨论】:

    • 我同意不是d = ++c;,但用d=1; 替换d = ++c || ++a &amp;&amp; ++b ; 并不能解释为什么c 变成1
    • @bruno 你什么意思,我听不懂你的意思
    • 你专注于解释为什么(++a &amp;&amp; ++b)没有被执行,并且在某种程度上'忘记'对c的修改,你喜欢if c i> 已初始化为 1 且未修改,OP 需要帮助,可能更好地解释所有内容,只需我的 2 美分 ;-)
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2020-02-14
    • 2021-04-21
    • 1970-01-01
    • 2016-04-18
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多