【问题标题】:What is the difference in 'for' and 'while' between or without brackets?括号之间的“for”和“while”有什么区别?
【发布时间】:2015-01-30 01:22:42
【问题描述】:

正如标题所说,我已经编写了一些代码并对其进行了测试,但由于某种原因我仍然无法理解。

for (…)
  {
    …
  }

for (…)
  …

while (…)
  {
    …
  }

while (…)
  …

另外,我发现在某些情况下main 在没有int 的情况下也可以工作,为什么会发生这种情况?还有,main 的正确写法是什么?

对不起,双重问题,我有很多疑问(特别是数组)。 谢谢和抱歉。

【问题讨论】:

  • 您可以在这里提出多个问题,但不要将它们归为一类。
  • main 必须始终返回 int.. int main()int main(int argc, char* argv[]).. 你需要了解作用域才能知道 for (...) { blah; }for (...) blah; 之间的区别
  • 对不起 Shomz。另外,我仍然不喜欢参数或指针(我知道它们存在以及它们是什么但还没有使用它们)。
  • 在旧的 C89/C90 标准中,int 可以省略;返回类型仍然被隐式地视为int。 C99 删除了隐含的int 规则,但并非所有编译器都强制执行较新的标准。你可以用一些编译器写main(),但你应该总是写int main(void)(或int main(int argc, char *argv[]))。
  • 无需抱歉。我看到你是新来的,所以我只是给你一些建议,让你的问题保持简单准确,不需要把多个问题挤成一个。

标签: c


【解决方案1】:

如果省略花括号,则循环体只是一条语句。大括号允许您在正文中放置多个语句。

带大括号:

while (...) {
    statement1;
    statement2;
    statement3;
}

所有3条语句将被重复执行。

不带大括号:

while (...) 
    statement1;
statement2;
statement3;

只有statement1 会被重复执行。其他两条语句将在循环结束后执行一次。

总是使用大括号是个好主意。见

Why is it considered a bad practice to omit curly braces?

【讨论】:

    【解决方案2】:

    forwhile 语句(也是 if` 语句)的语法是它始终只控制一个子语句。

    while 循环具有以下形式:

    while ( expression ) statement
    

    添加花括号仅仅意味着您使用了不同类型的语句。 复合语句{,后跟零个或多个声明或语句,后跟}组成。

    请注意,大括号不是while 语句语法的一部分。

    所以如果我写:

    while (foo)
        puts("hello");
    

    while 语句控制一个子语句,它恰好是一个函数调用。如果我写:

    while (foo) {
        puts("hello");
        puts("good-bye");
    }
    

    while 语句仍然控制一个子语句,但这次它恰好是一个复合语句,它本身包含两个子语句。

    正如其他人所指出的,使用复合语句的优势在于,当您想向循环体中添加某些内容时,它可以帮助避免错误。看到这样的错误代码并不少见:

    while (foo)
        puts("hello");
        puts("good-bye");
    

    这是完全合法的,大多数编译器不会抱怨,但第二次调用不受while控制;在while 循环完成后,它将只执行一次。通过从一开始就始终使用花括号,您可以避免此类特定错误。

    【讨论】:

      【解决方案3】:

      for/while 没有 {} 意味着只有下一条语句将成为循环的一部分,之后的任何语句都在循环之外。这会导致许多错误,并且可能不是一个好的一般做法。添加 {} 始终是一个好主意,因为如果您在循环中添加更多代码,即使您稍后忘记添加 {},也不会让自己头疼。

      【讨论】:

        【解决方案4】:

        长话短说,如果您省略块 C 控制结构(while、if、for、else...),它们通常会迭代或执行下一条语句。这是一个坏主意。事实证明,您可以在 whilefor 循环中放置很多东西来代替块,其中大多数也是一个坏主意。让我们看看 C99 标准。

        6.8.5 Iteration statements Syntax
          iteration-statement:
              while ( expression ) statement
              do statement while ( expression ) ;
              for ( expressionopt ; expressionopt ; expressionopt ) statement 
              for ( declaration expressionopt ; expressionopt ) statement
        

        请注意,它们都采用“语句”而不是“块”。什么是“声明”?

        6.8 Statements and blocks Syntax
          statement:
              labeled-statement
              compound-statement
              expression-statement
              selection-statement
              iteration-statement
              jump-statement
        

        长话短说,“复合语句”是块,“表达式语句”是单个表达式,我们现在将跳过其余部分。这是一个带有表达式语句的 while 循环。

        while( condition )
            do_something;
        

        这是一个带有复合语句的 while 循环。

        while( condition ) {
            do_this;
            and_this;
            and_this;
        }
        

        总是使用块是个好主意,即使是一行。为什么?因为你很容易自欺欺人,以为你在循环你不是的语句。

        while( condition )
            do_this;
            and_this;
            and_this;
        

        最后两个语句看起来确实是循环的一部分,但实际上不是。

        一个常见的错误是这样写:

        if( condition )
            do_this;
        else
            do_something_else;
            and_also_this;
        

        and_also_this 将始终被执行。

        总是包含块会更安全。

        The main question has already been answered elsewhere.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-06
          • 2013-04-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          相关资源
          最近更新 更多