if子句中的赋值无效

kaf*_*man 1 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;
}
Run Code Online (Sandbox Code Playgroud)

这打印

3
show: 1
0
show: 1
Run Code Online (Sandbox Code Playgroud)

所以,显然在第二个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;
}
Run Code Online (Sandbox Code Playgroud)

正如我所料,它输出:

3
show: 1
show: 0
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这里到底发生了什么?为什么output没有show在第一个例子的第2个if子句中分配?我在Windows 10上使用Visual Studio 2017工具链.

Hug*_*ira 6

这与运算符优先级有关.你的代码:

if (show = output || show)
Run Code Online (Sandbox Code Playgroud)

是相同的

if (show = (output || show))
Run Code Online (Sandbox Code Playgroud)

如果更改订单,结果将更改:

if ((show = output) || show)
Run Code Online (Sandbox Code Playgroud)

使用如上所述的if语句,它会打印:

3
show: 1
show: 0
Run Code Online (Sandbox Code Playgroud)