没有括号的for循环的绝对范围是多少?

时间:2012-12-21 18:41:26

标签: c scope

我有一个程序,它使用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?
        ....

4 个答案:

答案 0 :(得分:5)

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

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

但使用牙套可以减轻您的担忧。使用大括号,可以立即清楚范围是什么。

答案 1 :(得分:4)

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

在您的示例中,if ... else ...;是一个声明。

答案 2 :(得分:1)

我们可以变得非常极端:

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 / while内容周围使用大括号。使代码更易于阅读,如果易于阅读,则易于维护。

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

在合理范围内过剩绝对没有错。它们不会增加执行时间,只会在源代码中增加几个字节。除非您将补丁发布到linux内核邮件列表中,否则会导致被拒绝的代码。

答案 3 :(得分:0)

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