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工具链.
这与运算符优先级有关.你的代码:
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)