【问题标题】:Why I don't need brackets for loop and if statement为什么循环和 if 语句不需要括号
【发布时间】:2017-01-27 12:40:06
【问题描述】:

我不明白为什么在这种情况下我不需要括号

for (int i = 0; i < 10; i++) 
    if (num[i] < min) 
        min = num[i];

以及为什么在这种情况下我需要括号

int num[10], min;
for (int i = 0; i < 10; i++) {
        cout << "enter 10 numbers" << endl;
        cin >> num[i];
}

【问题讨论】:

  • 最好保留它们。没有的语法很容易出错。
  • 语法允许。
  • @πάνταῥεῖ 但它在编程书籍中被大量使用,这种语法有什么优势吗?
  • @Ayxan 如前所述,它容易出错,例如if 语句稍后添加,维护者忘记添加大括号。

标签: c++ if-statement for-loop brackets


【解决方案1】:

嗯。没有括号的循环很容易搞砸,尤其是在程序员累了的时候。

但是编译器可以理解。

示例1:以; 结尾并且紧跟for 语句的完整行属于for 语句的范围。但它后面的行不会。只需尝试编译并运行它。

#include <iostream>
int main(void){
    for (int i = 0; i < 10; i++) 
        std::cout << "in scope of for" << std::endl;
    std::cout << "out of scope of for" << std::endl;
}

示例 2:if 语句相同

#include <iostream>
int main(void){
    if (1 == 1)
        std::cout << "in scope of if" << std::endl;
    std::cout << "out of scope of if" << std::endl;
}

示例 3:

#include <iostream>
int main(void){
    int num[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int min = num[0];
    for (int i = 0; i < 10; i++) 
            if (num[i] < min) //this if belong to the for above
                min = num[i]; //this line belong to `if` above
                              //so this line also belong to the `for`
                              //as the `for` own the `if`
}

【讨论】:

  • iosteram?说累了!这是C++;在空参数列表中不需要void
【解决方案2】:

如回复所示,不建议不使用大括号。

for (int i = 0; i < 10; i++) /*For-loop only has one executable
                              *statement in its scope, the if-statement, 
                              *so doesn't need braces.*/
    if (num[i] < min) /*If-statement contains only one executable
                       *statement its scope, so doesn't need braces*/
        min = num[i]; //One line of code to execute.

坚持使用牙套,它会让你的生活更轻松。

【讨论】:

    【解决方案3】:

    我们基本上使用方括号来保持代码干净,据我所知,编译器并不是那么聪明,所以如果您在循环或 if 条件下有多个语句,那么我们只需使用方括号(大括号 {})让编译器知道大括号中的每个语句都是循环的一部分或 if 语句的一部分。

    【讨论】:

    • 编译器非常聪明,但它无法读懂你的想法。
    【解决方案4】:

    单语句 if 和 for 循环不需要花括号。这里讨论了为什么即使对于单个语句,花括号也是一种很好的做法。

    What's the purpose of using braces (i.e. {}) for a single-line if or loop?

    【讨论】:

    • 单行? op1; op2; 是单行吗?
    • FSVO“行”,是的。
    • 我认为你应该改变你的措辞,“单行”具有误导性
    • 有什么比单行更好的措辞?单行执行?
    • 声明。没有经验的开发人员可能认为将多条语句放在一行代码中(以文本形式)会使它们成为“单行”
    【解决方案5】:

    Lightness Races in Orbit 完美地总结了这一点 - 这只是一个良好实践的问题。出于纯粹的懒惰,许多程序员可能不会以这种方式使用括号(毕竟它是可选的)。

    如果您希望代码易于阅读,更重要的是易于调试,那么您应该养成在每个 for 循环和 if 语句后使用括号的习惯。

    一段时间后它可能会变得乏味,但就像我说的 - 这只是一个好的做法。

    【讨论】:

      【解决方案6】:

      for 循环的语法

      for (init, condition, post) statement;
      

      现在这意味着for(...) 之后的任何单个语句都将成为主体,并且将成为循环运行的内容。

      然后我们有 if 语句,其语法为

      if(condition) statement;
      

      所以我们可以看到整个 if

      if (num[i] < min) 
          min = num[i];
      

      只是一个语句,这就是 for 循环所需的全部内容。

      当我们在循环或条件中有多行时使用 {} 的原因是让我们使用多语句循环/条件,因为整个块被视为单个语句。

      【讨论】:

        【解决方案7】:
        1. 在 FOR 循环的情况下:您不必使用大括号,但据我所知,您应该使用。首先它增加了代码的可读性,它可以让你省去无用的调试代码。对于未来的读者,Oracle 的代码约定明确规定您应该始终使用大括号。

        2. 如果是 IF 语句:对于单个语句,您不必使用大括号,但如果您想在 IF 块内组合多个语句,则必须使用正确的大括号。

        希望我的意见对你有用。

        【讨论】:

          【解决方案8】:

          forif 后面都必须跟一个“声明”。 “语句”可以是简单语句,如min = num[i];,也可以是更复杂的语句,如if (num[i] &lt; min) min = num[i];,也可以是复合语句(即,零个或多个用花括号括起来的简单语句),如{ std::cout &lt;&lt; "enter 10 numbers\n"; std::cin &gt;&gt; num[i]; }

          有些人认为用语法上多余的花括号将简单的语句杂乱无章是一种很好的风格。其他人没有。

          【讨论】:

            【解决方案9】:

            因为你不知道。

            它们是可选的。就是这样。

            如果您不使用大括号将多个语句组合为一个,则只有 forif 前导码之后的第一个语句被视为该构造的一部分。 (但是这条规则是传递性的,所以你的分配是你的if 的一部分是你的for 的一部分!)

            需要注意的是,缩进没有效果

            许多人认为[需要引用]为了清楚起见,您应该始终使用大括号。

            【讨论】:

            • 其他人认为混淆可以很有趣 ;-) ioccc.org
            猜你喜欢
            • 2022-07-16
            • 1970-01-01
            • 2012-09-10
            • 2011-12-20
            • 2011-12-03
            • 2011-01-04
            • 2021-04-01
            • 2014-08-09
            相关资源
            最近更新 更多