0

我试图解决这个问题,即计算行数、空格数和制表符的数量。

我的解决方案不正确,因为我不知道如何使用 { }。

main ()
{

    int newline; 
    int tab; 
    int blank;
    int c;

    newline = 0;
    tab = 0;
    blank = 0;

    while ((c = getchar()) != EOF) 
        if (c == '\n')
            ++newline;
        if (c == '\t')
            ++tab;
        if (c == 32)
            ++blank;

    printf("lines: %d tabs: %d blanks: %d\n", newline, tab, blank);
}

在我的代码中,只计算新行。制表符和空格从未被计算在内。我知道答案是在 if 语句部分周围添加 { }。但我只知道这一点,因为我在谷歌上搜索了解决方案。

也许只有我一个人,但 K&R 并没有真正解释什么时候应该使用 { }。

有人可以解释我如何知道将 { } 添加到我的上述代码中吗? 当我阅读代码时,没有 {} 似乎很好。这意味着我真的不明白它的用法。为什么上面的代码中不计算制表符和空格?

您可以推荐另一本关于 C 的书吗? 我没有编程经验。

4

4 回答 4

2

简单的语法if是 : if (<condition>) <statement><statement>可以是单个语句(就像您在代码中所使用的那样),也可以是一个块(零个或多个用大括号括起来的语句)。当你只有一个语句时,是否用大括号括起来完全是一个风格问题——行为是一样的。

于 2013-07-19T15:24:59.803 回答
1

一个相对简单的“经验法则”:寻找分号。参考您的示例,从“while”开始,向前阅读,直到看到分号。如果您希望将该分号之外的任何内容作为您的 while 块的一部分执行,您需要将其全部包裹在花括号中。

另一种看待它的方式:分号是语句终止符。它终止了空白 = 0 作为您之前的声明;它不仅终止 if 还终止封闭的 while 语句。因此,要将以下 if 作为 while 块的一部分执行,您需要将 if 括在花括号中。

哦,顺便说一句,C 和类似的语言不会将句法含义附加到空格上。它最多被视为分隔符。您选择应用的任何缩进仅是为了人类读者的利益;它对编译器没有意义。

于 2013-07-19T15:29:58.263 回答
0

任何 if/while/for 后面都可以跟一个不带大括号的语句,或者封装在大括号中的任意数量的语句。如果你编写了一个 if/while/for 后跟许多语句并且没有大括号,那么只有第一个语句属于 if/while/for。请注意,无论您使用什么空格都无关紧要,它只是为了便于阅读。

如果它是用大括号编写的,这相当于您的代码:

while ((c = getchar()) != EOF) 
{
    if (c == '\n')
    {
        ++newline;
    }
}

if (c == '\t')
{
   ++tab;
}

if (c == 32)
{
   ++blank;
}

你想要什么:

while ((c = getchar()) != EOF) 
{
   if (c == '\n')
   {
       ++newline;
   }

   if (c == '\t')
   {
      ++tab;
   }

   if (c == 32)
   {
      ++blank;
   }
}

这相当于

while ((c = getchar()) != EOF) 
{
   if (c == '\n')
       ++newline;

   if (c == '\t')
      ++tab;

   if (c == 32)
      ++blank;
}

大括号的排除绝对没有任何目的,但风格。如果您有任何疑问,请包括大括号。

于 2013-07-19T15:32:23.243 回答
0

大括号 ( {and }) 用于将零个或多个语句转换为单个复合语句。在您希望将一组语句视为单个语句的任何地方,您都应该使用大括号。

例如,一个while循环执行一条语句,同时它的计算结果为真:

  while(some-condition)
    statement

很明显,有时您想要执行多个语句,这就是您将它们包围起来的地方{}以便将它们变成单个复合语句。

于 2013-07-19T15:33:22.967 回答