【问题标题】:How the expression evaluates? [duplicate]表达式如何计算? [复制]
【发布时间】:2014-04-06 12:14:54
【问题描述】:

有人可以画出表达式的优先级树,请解释一下副作用..在 C 中表达式求值后的值。

int i=-3, j=2, k=0, m;
m= ++i || ++j&&++k;

根据我的输出应该是 -2 3 1 1 但我的 gnu c 编译器打印是 -2 2 0 1? 我想知道怎么做?

【问题讨论】:

    标签: c expression


    【解决方案1】:

    因为j 由于short circuit evaluation 而不会被评估:

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

    在这个阶段,无论|| 的右侧如何,m 已经被评估为 1。为什么?

    因为1 || anything 是 1。

    【讨论】:

    • 但 ++ 的优先级高于 ||所以我认为 ++j 应该首先与其他 ++ 运算符一起评估?
    • 优先级是关于解析,短路评估是关于执行。优先级决定了表达式的解释方式,而执行规则决定了代码的实际作用。
    【解决方案2】:

    C 短路中的 &&|| 运算符。这意味着如果它们左侧的值足以确定整体值,则永远不会评估右侧。

    您的表达式被解析为(++i) || ((++j)&&(++k))|| 短路,所以在计算 ++i 后,发现它的值为 -2true 值),不再计算表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 2023-04-08
      • 2023-03-08
      • 2013-05-26
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多