【问题标题】:C++ "else" statement when the preceding line has multiple "if" statements前一行有多个“if”语句时的C++“else”语句
【发布时间】:2021-05-31 09:33:00
【问题描述】:

下面的 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”。

【问题讨论】:

  • 一个很好的例子,说明为什么应该使用大括号和缩进。
  • 同范围内最接近的if。如果没有,那就没有多大用处了。
  • "有理由这样实现吗?"它还能如何工作?如果添加大括号,您将看到如果 else 引用第一个 if,则无法将 else 用于第二个
  • @463035818_is_not_a_number 我假设如果“if”语句包含在一行中,那么右大括号将在该行中
  • 行无关紧要。您可以将所有内容放在一行中或将每个标记放在单独的行中,而不会改变含义

标签: c++ if-statement standards undefined-behavior


【解决方案1】:

有一个答案试图提倡添加大括号。我们也可以在不使用大括号的情况下重新排列您的代码,以更清楚地了解它的作用(以及为什么它没有按照您的意图做):

#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] 是 statement-true,[2] 是内部 if-else 语句的 statement-false。

意图和线条无关紧要,这就是为什么建议始终使用大括号:

        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,这基本上只是他们(现已删除)答案的重新表述。

【讨论】:

  • fwiw,适用于 acraigs 答案的相同批评也适用于此处,但不确定必须深入。我知道这还不如准确引用标准,但我希望它足以说服
  • 更具体地说,弱点是“在你的情况下,整个......是statement-true”不知道如何更清楚
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多