if子句中的赋值无效

时间:2018-10-21 20:34:50

标签: c++ if-statement variable-assignment

考虑以下代码(我意识到这是一种不好的做法,只是好奇地知道为什么会发生):

#include <iostream>

int main() {
    bool show = false;
    int output = 3;

    if (show = output || show)
        std::cout << output << std::endl;
    std::cout << "show: " << show << std::endl;

    output = 0;
    if (show = output || show)
        std::cout << output << std::endl;
    std::cout << "show: " << show << std::endl;

    return 0;
}

此打印

3
show: 1
0
show: 1

因此,显然在第二个if子句中,output(即0)的分配实际上并未发生。如果我这样重写代码:

#include <iostream>

int main() {
    bool show = false;
    int output = 3;

    if (show = output || show)
        std::cout << output << std::endl;
    std::cout << "show: " << show << std::endl;

    output = 0;
    if (show = output)  // no more || show
        std::cout << output << std::endl;
    std::cout << "show: " << show << std::endl;

    return 0;
}

如我所料,它输出:

3
show: 1
show: 0

有人可以解释这里实际发生的情况吗?为什么在第一个示例的第二个if子句中没有将output分配给show?我在Windows 10上使用Visual Studio 2017工具链。

2 个答案:

答案 0 :(得分:6)

这与运算符优先级有关。您的代码:

if (show = output || show)

相同
if (show = (output || show))

如果更改顺序,结果将更改:

if ((show = output) || show)

使用上面的if语句,它会打印:

3
show: 1
show: 0

答案 1 :(得分:2)

由于||的运算符优先级,所以不会发生分配运算符高于赋值运算符。您分配输出||显示哪个是0 || true,在第二个if中计算为true。