c++ - 前一行有多个“if”语句时的C++“else”语句
问题描述
以下 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;
}
输出
B 1 0
B 1 1
A 1 2
B 1 3
B 1 4
由此我推断“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;
}
一般语法(参见例如here)是:
if ( condition ) statement-true
在你的情况下,整个
if(j==2)
std::cout << "A " << i << ' ' << j << std::endl; // [1]
else
std::cout << "B " << i << ' ' << j << std::endl; // [2]
是statement-true
。虽然一般if-else
是:
if ( condition ) statement-true else statement-false
因此,[1]
is the statement-true
and [2]
is statement-false
the 内部 if-else-statement。
意图和线条无关紧要,这就是为什么建议始终使用大括号:
if(i==1) {
if(j==2) {
std::cout << "A " << i << ' ' << j << std::endl;
} else {
std::cout << "B " << i << ' ' << j << std::endl;
}
}
或者,如果这就是你想要的:
if(i==1) {
if(j==2) {
std::cout << "A " << i << ' ' << j << std::endl;
}
} else {
std::cout << "B " << i << ' ' << j << std::endl;
}
归功于 acraig5075,这基本上只是他们(现已删除)答案的重新表述。
推荐阅读
- firebase - Flutter Firestore 实时计数文档
- angular - 对于单元测试中没有构造函数的扩展类,Angular 10 依赖注入失败
- python - 我在 Python 中创建了商店计算器,但它有一些错误
- php - 如何将 HTML 内容和特殊字符转换为 Html 实体
- spring - 我可以从实体设置数据库序列的最小/最大值吗?
- python - Python绘图不是从中心开始
- python - 如何将创建的文本通道添加到类别?
- python - 我对变量做错了什么?
- php - Opencart 2.3 url 不会在 config.php 中重写
- react-redux - 我可以在使用 React Context 提供程序的同时使用 Redux 工具包吗?