花括号和范围如何在C中起作用?

时间:2013-08-06 13:51:39

标签: c scope curly-braces

我正在尝试在业余时间学习一些C.我有一些Java经验,因此我习惯于用花括号来限制变量的范围。但我有点困惑,因为好像Brian W. Kernighan / Dennis M. Ritchie的书“The C Programming Language”并没有使用很多花括号,我认为使用它们是正常的(来自Java的角度)。即1.6在代码所在的书中:

while((c = getchar())) != EOF)
    if (c >= '0' && c <= '9')
        ++ndigit[c-'0'];
    else if() /*and so forth...*/
        ++nwhite;
    else
        ++nother;

从Java的角度来看,我习惯只会运行第一个语句,因为缺少大括号,但缩进表明一切都会运行(if,else if else)

所以我要问的是:这里会运行什么,为什么会运行? if,else if和else都在while循环的范围内吗?是否要引用任何约定,我可以阅读以试图更好地理解它?提前谢谢。

4 个答案:

答案 0 :(得分:4)

whileifelse ifelse后跟一个语句。此语句可以是C的实际行,也可以是块语句(由大括号括起)。 ifelse ifelse被视为一个区块。

因此,使用大括号,这将是等效的:

while((c = getchar())) != EOF) {
    if (c >= '0' && c <= '9') {
        ++ndigit[c-'0'];
    }
    else if() {  /*and so forth...*/
        ++nwhite;
    }
    else {
        ++nother;
    }
}

答案 1 :(得分:1)

如果if语句不包含花括号,则可以在之后内联最多一个分号,并且它将自动假设花括号:

while((c = getchar())) != EOF){
    if (c >= '0' && c <= '9')
    {
        ++ndigit[c-'0'];
    }
    else if() /*and so forth...*/
    {
        ++nwhite;
    }
    else
    {
        ++nother; 
    }
 }

所以这是有效的:

 while(true) i++;

这不应该是有效的:

 while(true) i++; break; printf("hello");

 if(true) printf("Hello"); break; 

答案 2 :(得分:1)

您可以将if/else if/else条指令视为一个区块 - 它们无法真正划分,else不能单独存在。

在旁注中,当你遇到像

这样的情况时,它有时会让人感到困惑
if(something)
   if (somethingOther)
     ....
else
   .....

如果你的代码足够长,你可能会对这个else的附加位置感到困惑,所以总是使用大括号是件好事。如评论中所述,else始终附加到“最近的”if

答案 3 :(得分:1)

在C中,与在Java中一样,ìfwhile有一个语句作为其主体,if可以有一个可选的else子句,其中一个语句为它的身体。在大多数可以有一个语句的地方,你可以有一个语句块,这是一个由大括号括起来的语句列表。这在C中与在Java中没有区别。

为了避免歧义,如果有两个ifs和一个else,则else被定义为引用最后一个。 I. e。

if(a) x if(b) y else z

定义为

if(a) x { if(b) y else z }

而不是

if(a) x { if(b) y } else z

这里,x,y和z是语句 - 也可以是语句块。

然而,说完这一切后,它很容易丢掉大括号,因此许多编码指南建议总是使用大括号。