我正在尝试在业余时间学习一些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循环的范围内吗?是否要引用任何约定,我可以阅读以试图更好地理解它?提前谢谢。
答案 0 :(得分:4)
while
,if
,else if
和else
后跟一个语句。此语句可以是C的实际行,也可以是块语句(由大括号括起)。 if
,else if
和else
被视为一个区块。
因此,使用大括号,这将是等效的:
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中一样,ì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是语句 - 也可以是语句块。
然而,说完这一切后,它很容易丢掉大括号,因此许多编码指南建议总是使用大括号。