我可以在哪些情况下省略C中的花括号?

时间:2015-01-22 23:05:59

标签: c

我正在阅读着名的K& R书,并被1.6中的例子所困扰。

#include <stdio.h>
/* count digits, white space, others */
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;

    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");

    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);

    printf(", white space = %d, other = %d\n", nwhite, nother);
}

为什么while语句可以在没有花括号的情况下工作?我知道如果块中只有一个语句,则可以省略它们。但在我看来,如果......其他如果......其他不是单一陈述。任何人都可以向我解释一下吗?

2 个答案:

答案 0 :(得分:7)

while语句的语法是:

while ( expression ) statement

在C语法中,语句是:

statement:
    labeled-statement
    compound-statement
    expression-statement
    selection-statement
    iteration-statement
    jump-statement

并且选择语句定义为:

selection-statement:
    if ( expression ) statement
    if ( expression ) statement else statement
    switch ( expression ) statement

因此,您可以看到if .. else if .. else本身就是一种陈述。

您可能还注意到复合语句本身就是一个语句,例如,这个块:

{
    statement1;
    statement2;
}

也是一个声明。

答案 1 :(得分:-4)

如果从表达式中删除了Curly Braces,则只对单个语句执行表达式。