【问题标题】:What is the absolute scope of a for loop with no brackets? [closed]没有括号的 for 循环的绝对范围是什么? [关闭]
【发布时间】:2012-12-09 08:22:05
【问题描述】:

我有一个程序,它使用 for 循环来检查条件语句并对数据集运行测试,其中大多数是一个可能会分支的线性 if 语句。我的问题是带括号的 for 循环如何决定范围内和范围外的内容?例如:

我的程序中有一个 for 循环:

for( i =0; i < (sizeof(exact_roots) / sizeof(bn_comlplex)); i++){
        if(fabs(roots[k].re - exact_roots[i].re) < 0.00001 && fabs(roots[i].im - exact_roots[i].im) < 0.00001)
            rootmatch++;
}

在这种情况下需要括号吗? for 循环会将第三行视为 for 循环的一部分还是将其丢弃并给我一个编译错误?

没有括号的for循环的极端情况如何,循环如何处理它?

for(i = 0; i < num; i++)
    if(something)
        ....
    else //is this still considered apart of the loop?
        ....

【问题讨论】:

  • 为什么要这样编码?它被认为是容易出错的代码。
  • 只是对没有括号的 for 循环的主题感到好奇,感谢大家的快速回答。

标签: c scope


【解决方案1】:
for(i = 0; i < num; i++)
    if(something)
        ....
    else //is this still considered apart of the loop?
        ....

是的,它仍然是循环的一部分。整个if () .... else ... 构造是一个语句。

但是使用大括号可以让您免除后顾之忧。有了大括号,作用域就一目了然了。

【讨论】:

    【解决方案2】:

    只有下一条语句是循环的一部分。

    在您的示例中,if ... else ...; 是一个语句。

    【讨论】:

    • 还有大括号 - 关键是大括号及其内容算作单个“复合语句”(或“块”)。 (顺便说一句,+1)
    • 所以对于我上面发布的示例循环和其他循环不使用大括号是安全的吗?还是我应该考虑保留大括号
    • @Need4Sleep:如有疑问,请保留大括号以避免意外并更加清楚您的意图(它也适用于对运算符优先级的怀疑)。
    • @Need4Sleep:就我个人而言,我建议始终使用大括号来避免混淆并降低出现错误的风险,但归根结底这是一个口味问题。有些人喜欢在允许的情况下省略大括号以节省垂直空间。有whole questions专门针对此事发表意见,双方意见。
    • 这真的是代码风格的问题。我建议您保留大括号,以便其他人更好地理解您的代码。
    【解决方案3】:

    我们可以变得非常极端:

    for( i =0; i < (sizeof(exact_roots) / sizeof(bn_comlplex)); i++)
            if(fabs(roots[k].re - exact_roots[i].re) < 0.00001 && fabs(roots[i].im - exact_roots[i].im) < 0.00001)
                rootmatch++;
            else if (something)
               if (someother)
                   do_stuff1();
               else if (third things)
                       do_stuff2()
                    else
                       do_another();
            else
                do_failed();
    

    当然,如果我对它进行代码审查,除非它有大括号,否则我不会接受它,因为很快你就会混淆哪个 if 在哪个里面,以及你在哪里结束了 else。

    出于这个原因,我几乎总是在所有 if/while 内容周围使用大括号。使代码更容易阅读,如果易于阅读,则易于维护。

    当然,当你突然决定在其中一个 if 语句中添加 "printf("x = %d\n", x); 时,添加额外的大括号会有所帮助,然后必须添加额外的大括号确保你得到想要的效果并且没有编译器错误。

    多余的[在合理范围内]大括号绝对没有错。它们不会增加执行时间,并且只在源代码中额外占用几个字节。当然,除非您将补丁发布到 linux 内核邮件列表,否则额外的大括号会导致代码被拒绝。

    【讨论】:

      【解决方案4】:

      如果没有大括号,您只能在 for、if 和 else 语句下执行一个语句。大括号允许您包含一组复合语句并使您的代码更具可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-05
        • 2014-05-07
        • 1970-01-01
        • 2020-10-03
        • 2013-03-25
        • 2012-12-05
        • 2019-03-09
        • 1970-01-01
        相关资源
        最近更新 更多