jta*_*llk 2 c++ standards if-statement undefined-behavior
下面的 C++ 程序
#include <iostream>
int main() {
for(int i=0; i<5; i++) for(int j=0; j<5; j++){
if(i==1) if(j==2) std::cout << "A " << i << ' ' << j << std::endl;
else std::cout << "B " << i << ' ' << j << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产出
B 1 0
B 1 1
A 1 2
B 1 3
B 1 4
Run Code Online (Sandbox Code Playgroud)
由此我推断“else”语句指的是第二个“if”。
C++ 标准中是否描述了这种行为?有没有理由以这种方式实施它?我直觉地认为“else”指的是第一个“if”。
有一个答案试图提倡添加大括号。我们也可以在没有大括号的情况下重新排列您的代码,以更清楚地看到它的作用(以及为什么它没有按照您的意愿行事):
#include <iostream>
int main() {
for(int i=0; i<5; i++) for(int j=0; j<5; j++){
if(i==1)
if(j==2)
std::cout << "A " << i << ' ' << j << std::endl;
else
std::cout << "B " << i << ' ' << j << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一般语法(参见例如此处)是:
if ( condition ) statement-true
Run Code Online (Sandbox Code Playgroud)
在你的情况下整个
if(j==2)
std::cout << "A " << i << ' ' << j << std::endl; // [1]
else
std::cout << "B " << i << ' ' << j << std::endl; // [2]
Run Code Online (Sandbox Code Playgroud)
是statement-true. 而一般if-else是:
if ( condition ) statement-true else statement-false
Run Code Online (Sandbox Code Playgroud)
因此,[1]是statement-true和[2]是statement-false内部的if-else语句的。
意图和行无关紧要,这就是为什么建议始终使用大括号的原因:
if(i==1) {
if(j==2) {
std::cout << "A " << i << ' ' << j << std::endl;
} else {
std::cout << "B " << i << ' ' << j << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果这就是你想要的:
if(i==1) {
if(j==2) {
std::cout << "A " << i << ' ' << j << std::endl;
}
} else {
std::cout << "B " << i << ' ' << j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
归功于 acraig5075,这基本上只是他们(现已删除)答案的重新表述。