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

我正忙着在业余时间学习一些C. 我有一些Java经验,因此我习惯用大括号来限制ie变量的范围。 但我有点困惑,因为看起来好像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循环的范围内吗? 是否要引用任何约定,我可以阅读以试图更好地理解它? 提前致谢。

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; } } 

您可以将if/else if/else指令视为一个块 – 它们实际上不能被分割, else它们本身就不存在。

在旁注中,当你遇到类似的情况时,它有时会让人感到困惑

 if(something) if (somethingOther) .... else ..... 

如果你的代码足够长,你可能会混淆在哪里附加else ,所以总是使用大括号是好的。 如评论中所述, else总是附加到“最近”的if

如果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; 

在C中,如在Java中,“ ìf和“ while有一个语句作为其主体,并且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是语句 – 也可以是语句块。

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