【问题标题】:How does c++ evaluate assignment operators (if statement)c++如何评估赋值运算符(if语句)
【发布时间】:2018-06-12 23:06:52
【问题描述】:

考虑以下

int main() {
    int a = 8;
    int b = 10;

    while (true) {
        if (a /= 2 && b < 12) {
            b++;
            std::cout << b << std::endl;
        }
        else break;
    }

    return 0;
}

现在 c++ 不是我的主要语言,但是 c++ 如何评估这个 if 语句?

在这种情况下,当b&gt;=12时,编译器会抛出“被零除”异常,但是为什么呢?

现在,如果我将状态括在括号中,则不会出现异常。

if( (a /= 2) && (b < 12))

这是否与 c++ 如何评估语句有关?

如果评估不是问题:

我知道

a = (a/2 && b<12)

也不会持有。

P Λ QP Λ ¬Q 不成立,但 P 的状态不应该受到影响吗?为什么是P 而不是¬Q 受到指责?

【问题讨论】:

  • “我无法在 java 中尝试这个,因为 java 不允许以同样的方式将整数表示为布尔值” - 好吧,只需添加 ` != 0 ` 你可以走了。在C++ 中,任何不同于0 的整数都会计算为true,因此在Java 中模拟这种行为并不是什么大问题
  • @Fureeish 好吧,我不确定 java 是否会以同样的方式评估它,因此我不想得出任何结论试图在 java 上强制示例
  • @HolyBlackCat 啊是的,这是真的。在所有运算符中,任何类型的赋值都具有次低的operator precedence。您可能希望将其添加为答案。

标签: c++ parsing if-statement evaluation


【解决方案1】:
if (a /= 2 && b < 12)

等同于:

if (a /= (2 && b < 12))

所以:

  • 2 被评估,在 &amp;&amp; 的操作数上下文中转换为 true。这不会触发短路评估,因此我们继续...
  • b &lt; 12,在你所说的情况下是false
  • 所以2 &amp;&amp; b &lt; 12 的整体评估结果为false
  • 因此a /= 2 &amp;&amp; b &lt; 12 在这里等价于a /= false,也就是等价于a /= 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多