【问题标题】:Problem understanding blocks in CC中的问题理解块
【发布时间】:2011-07-07 02:30:43
【问题描述】:

我正在学习用 C 编程,我正在做一个练习,要求我编写一个程序来打印一个等腰三角形。

#include <stdio.h>

int main()
{
    int col, row;

    for(col = 0; col < 6; col++)
    {
       for(row = 0; row <= col; row++)
       {
          putchar('*');
            putchar('\n');
       }
    }
}

此代码在一行上单独打印 (*) 21 次。因此,经过几分钟的反复试验,我删除了内部 for 循环上的内部大括号。

#include <stdio.h>

int main()
{
    int col, row;

    for(col = 0; col < 6; col++)
    {
       for(row = 0; row <= col; row++)
          putchar('*');
            putchar('\n');
    }
}

我终于达到了我想要的结果。

所以我的问题是:内部 for 循环的内部大括号{} 如何影响结果的打印方式?为什么第一组代码在一行上也打印了 21 次 *?

我翻阅了我的书,找不到合理的解决方案来解释为什么内部 for 循环中的 { } 会影响输出。

【问题讨论】:

  • 我正在阅读 2 本书 atm,K&R 第二版和 Sams 在 21 天内自学 C。你有什么推荐的?
  • @nastyn8 - 如果 K&R 不解释这一点(不能确定 - 没有副本),世界比我想象的要陌生得多。但是我可以相信,如果您还不知道自己做错了什么,那么查找起来并不容易。
  • K&R 是一个不错的选择,我相信会谈到这一点。我建议您更仔细地阅读带有解释的示例。
  • @steve314 好吧,我确定 K&R 会,而且我从来没有说过它没有提到它,但我一直主要关注 Sam 的 C,因为它是一本更容易理解的书,而我没有不要通过 K&R 寻找解决方案,当我说我正在“通过书本寻找解决方案”时,我专门谈到了 Sam 的自学 C,@Aaron 谢谢,我会放慢速度,慢慢来理解,我有时会很匆忙。
  • @nastyn8 对于大多数人来说,很难理解为什么有人可能不理解 {} 在这里的工作原理,因此如果您解释一下认为他们在做什么会有所帮助。跨度>

标签: c syntax for-loop


【解决方案1】:

您的工作解决方案相当于

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
   }
   putchar('\n');
}

在 C 中,缩进与语句的分组无关。大括号将语句组合在一起。在您原来的、不工作的代码中,内循环后面的大括号使大括号内的所有代码都运行每个循环迭代。在上面的示例中,您可以看到大括号仅包含为 for 循环的每次迭代运行的适当表达式。

正如其他人可能注意到的那样:缩进不会告诉编译器要做什么,但您应该缩进以便直观地解释您的代码。

【讨论】:

  • +1 - 但“缩进与分组无关”只是编译器的观点。缩进(始终如一地完成)对于可读性仍然很重要。即使一个块中只有一个语句,省略大括号通常被认为是不好的样式,除非该语句与 for 或其他任何内容在同一行。另外,因为我脾气暴躁,所以我会抱怨你的左括号位置不一致。
  • 该死的——你修好了。我想我现在必须对自己发脾气了。
【解决方案2】:

for(或while)循环执行{ }之间的代码。

但是,有一个不使用{ } 的简短形式,例如:

for (i = 0; i < 10; i++)
    function();

for 没有找到{ } 时,它解释为只有下一条语句 将成为循环体的一部分。

您通过反复试验取得的成果相当于:

for(col = 0; col < 6; col++) {
   for(row = 0; row <= col; row++) {
      putchar('*');
   }
   putchar('\n');
}

注意putchar('\n') 如何位于内部 for 循环之外。

【讨论】:

  • 不是“只有下一行”,而是下一个语句是循环体的一部分。
  • 确实会更准确。
  • 确实是正确的而不是错误的; C 不关心行。
【解决方案3】:

就大括号外的结构而言,最好的观察方法是看到大括号将一组语句转换为单个语句。 for 循环执行紧随其后的语句,在您的第一次尝试中,它是一个包含两个打印语句的块。您的缩进具有误导性,最好按如下方式排列:

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
      putchar('\n');
   }
}

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
      putchar('*');
    putchar('\n');
}

缩进用于表示在给定缩进级别的连续行在同一个块中,通常是由紧接在该块之前的语句“拥有”的块。如果您想使用大括号使事情更加清晰(许多编码风格都建议这样做),请尝试:

for(col = 0; col < 6; col++)
{
   for(row = 0; row <= col; row++)
   {
      putchar('*');
   }
   putchar('\n');
}

【讨论】:

    【解决方案4】:

    当您删除了一对内部循环大括号时,您使该内部 for 循环的范围只是打印“*”的单个语句。然后换行符“\n”只打印一次,而不是每次打印星号时打印一次。

    C 中的花括号将一个“块”语句组合在一起,以便它们一起执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2014-08-06
      • 2011-10-22
      相关资源
      最近更新 更多