【问题标题】:Why isn't “k” incremented in the statement “m = ++i || ++j && ++k”? [duplicate]为什么在语句“m = ++i ||”中“k”不递增++j && ++k”? [复制]
【发布时间】:2016-08-04 18:36:25
【问题描述】:

第一部分:

i=j=k=1;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);

输出:2、2、1、1

第一部分很容易理解,这里++i && ++j先执行,这是真的(并且i和j的递增值)所以不需要检查下一部分的OR运算(不需要k的递增值)。

第二部分:

i=j=k=1;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);

输出:2、1、1、1

第二部分让人难以理解,这里++i || ++j首先执行,其中++i为真(并增加i的值,因为OR运算所以不需要增加j的值)。接下来在这里执行AND操作应该是k=2的增量值(但仍然是k print 1的值)。

亲爱的利他主义者,请解释一下第二部分发生了什么。

【问题讨论】:

  • true || <whatever> == true 对于whatever 的任何值。如果是这样,为什么还要打扰whatever
  • 你最喜欢的 C 书怎么说?或者 C 的任何操作员概述?你有没有尝试过自己先回答这个问题?
  • 不确定 ++j && ++k 是否先执行,因为运算符优先级。

标签: c++ c expression logical-operators


【解决方案1】:

&& 在 C/C++ 中的优先级高于 ||,将您的代码呈现为:

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

由于++i 已经为真,第二部分没有执行(short-circuit evaluation)。

有关运算符优先级,请参阅http://de.cppreference.com/w/cpp/language/operator_precedence

【讨论】:

    【解决方案2】:

    我认为您对i, j, k, and m 的使用可能会让您更难看到正在发生的事情。

    int i, j, k;
    
    i=j=1;
    k = ++i && ++j;
    printf("%d, %d, %d\n", i, j, k); // 2, 2, 1
    
    i=j=1;
    k = ++i || ++j;
    printf("%d, %d, %d\n", i, j, k); // 2, 1, 1
    

    查看https://en.wikipedia.org/wiki/Short-circuit_evaluation 以了解更多关于您所看到内容背后的概念和http://en.cppreference.com/w/c/language/operator_precedence 如果您想了解有关运算符优先级的更多信息。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2014-02-15
      • 1970-01-01
      • 2018-09-06
      • 2021-02-28
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多