如何构建“for”语句?

时间:2015-09-28 20:41:50

标签: c++ language-lawyer

每个人都知道最常见的用途:(0 - 9)

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

然而,我也看到了一些不常见的版本,如(1 - 10)

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

或(1 - 10)

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

这表明循环可能比我想象的更可定制。如果我猜错了,那就好像是

  1. 总是需要2个分号来分隔3个可选语句
  2. 第二个语句需要可转换为布尔值1才能使循环继续
  3. 第一个语句是我可以声明变量并且只调用一次
  4. 的语句
  5. 第三个和第二个语句在每次迭代后调用,并且可以包含任何内容(除了声明)
  6. 只要满足这些条件,我就可以做任何事情
  7. 例如(0,3,7)

    for (int i = 0, j = 2; i < 10; i+=++j)
    

    这些for循环是否被认为是该语言的标准用法?或者只是因为msvc ++中的实现设计而发生的事情?关于for循环规则究竟是什么的官方说明?

4 个答案:

答案 0 :(得分:3)

你是对的。然而...

仅仅因为它可能并不意味着你应该这样做。 &#34; for&#34;的全部目的循环是否应该在任何有能力的程序员可以快速理解的水平上进行组织。一个关键的基础是程序员应该知道&#34; for&#34;循环将运行。如果你增加了教学内容的复杂性,那么&#34; for&#34;循环丢失了。我不能轻易看到你的第三个例子,并告诉循环迭代多长时间。

如果您需要使用&#34; for&#34;像你的第三个例子一样循环,你最好写一个while / do-while循环。

答案 1 :(得分:2)

我个人最喜欢的一个是迭代链表:

for(Node *p = head; p; p = p->next)  ... 

当然,如果你做了#34;没有条件&#34;,你会得到一个无限循环:

for(;;) ... 

但是,是的,只要你有for(跟随有效的陈述,两个分号和),它就是&#34;好的代码&#34;。

for(printf("h"); !printf("world\n"); printf("ello, "));

是有效的,如果相当奇怪的C代码(和C ++,但在那里首选cout)。

当然,&#34;它编译并做你期望的事情&#34;没有使它正确或善用该语言。如果其他人可以阅读代码并理解其意图,并且不想在其他地方工作或对最初编写代码的人执行暴力行为,那么它通常是首选。

答案 2 :(得分:2)

从ISO C99草案:

  

for ( clause-1 ; expression-2 ; expression-3 )语句表现为   如下:

     

表达式-2表达控制表达式   在每次执行循环体之前评估。

     

表达式-3被评估为每个之后的空表达式   执行循环体。

     

如果第1条是声明,则范围为   它声明的任何标识符都是声明的剩余部分   整个循环,包括其他两个表达式;达到了   第一次评估控制之前的执行顺序   表达。

     

如果子句-1是表达式,则将其评估为void   在第一次评估控制之前的表达   表达

     

可以省略子句-1和表达式-3。一个   省略的表达式-2被非零常量替换。

回答你的问题:

  1. 总是需要2个分号来分隔3个可选语句

    是。

  2. 第二个语句需要可转换为布尔值1才能继续循环。

    是。第二个语句将评估为布尔值true / false(尽管不一定是&#34; 1&#34;)。

  3. 第一个语句是我唯一可以声明变量并且被调用一次的语句

    对于C ++,是的。在C(在C99之前),你必须在for循环之外声明变量。

  4. 第三次和第二次语句在每次迭代后调用,并且可以包含任何内容(除了声明)

    是。他们可能什么都没有。例如,for ( ;; )表示&#34;永远循环&#34;。 只要满足这些条件,我就可以做任何事情

  5. 这是一个很好的教程:

答案 3 :(得分:1)

这取决于你想怎么做。 C ++非常灵活,允许您根据需要构建语句。当然,更清晰的方式更可取。

&#34; for&#34;声明有3个部分用&#34;;&#34;字符:

1)初始化代码(int i = 0):你在那里初始化你将在你的循环中使用的计数器变量;

2)循环条件(i <20):将测试循环以继续的条件;

3)步骤(增量):您可以选择指定计数器变量的增量;

&#34; for&#34;当你知道你要迭代多少次(循环)时,语句更可取并指明用途。否则,建议使用&#34;而#34;。

C ++的灵活性示例:

for(int i = 0; i < 20; i++) { }

相当于

int i = 0;    
for(;i < 20;) { i++; }