在C中为什么我不能这样写一个for()循环:for(int i = 1,double i2 = 0;

或者“在for循环中声明多个变量ist verboten”?

我的原始代码是

 for( int i = 1, int i2 = 1; 
      i2 < mid;
      i++, i2 = i * i ) {

我想循环通过第一个这么多的广场,并且想要数字和它的正方形,停止条件取决于广场。这段代码似乎是意图的最干净的表达,但它是无效的。我可以想到十几种方法来解决这个问题,所以我不是寻找最好的选择,而是更深入地了解为什么这是无效的。一点语言的律师,如果你愿意的话。

我已经够年纪了,当你必须在函数开始时声明所有的变量,所以我很感激

for( int i = 0; ....

句法。读取它看起来像在for()语句的第一部分只能有一个类型声明。所以你可以做

for( int i=0, j=0; ...

甚至稍微巴洛克式

for( int i=0, *j=&i; ...

但不是对我的敏感

for( int i=0, double x=0.0; ...

有人知道为什么吗这是对()的限制吗?或逗号列表的限制,例如“逗号列表的第一个元素可以声明一个类型,而不是另一个。”以下是逗号分隔C的不同语法元素吗?

(一个)

for( int i=0, j=0; ...

(B)

int i = 0, j = 0;

(C)

 int z;
 z = 1, 3, 4;

有什么大师呢?

================================================== ==

根据我收到的良好回应,我想我可以提出一个问题:

在一个for语句

for( X; Y; Z;) {..... }

什么是X,Y和Z?

我的问题是关于C,但是我没有很好的参考。在我的C参考文献(Harbison and Steele 4th ed,1995)中,它们都是三个表达式,我的gcc要求使用C99模式(int i = 0;

在Stroustrup,第6.3节,for语句的语法如下

for(for-init-statement; condition; expression)语句

所以C有一个专门针对for()的第一个子句的语法语句,我们可以假定它们具有超出表达式的特殊规则。这个声音是否有效?

int i = 1,double i2 = 0;不是一个有效的声明语句,所以它不能在for语句里面使用。如果该语句不能独立在for外面,那么它不能在for语句中使用。

编辑:
关于你对逗号运算符的问题,选项’A’和’B’是相同的,都是有效的。选项’C’也是有效的,但可能不会做你期望的。 z将被分配1,并且语句3和4实际上不执行任何操作(你的编译器可能会警告你关于“没有效果的语句”,并优化它们)。

更新:
为了解决编辑中的问题,下面是C++ spec(第6.5节)定义如下:

for ( for-init-statement condition(opt) ; expression(opt) ) statement

它进一步将for-init-statement定义为expression-statement或simple-declaration。条件和表达式都是可选的。

for-init-statement可以是任何有效的表达式语句(如i = 0;)或简单声明(如int i = 0;)。语句int i = 1,double i2 = 0;根据规范不是一个有效的简单声明,所以与…一起使用是无效的。作为参考,一个简单的声明被定义(在第7节)为:

attribute-specifier(opt) decl-specifier-seq(opt) init-declarator-list(opt) ;

其中decl-specifier-seq将是数据类型加上关键字,如static或extern,init-declarator-list将是逗号分隔的声明器列表及其可选的初始化器。尝试将多个数据类型放在相同的简单声明中本质上会放置一个decl-specifier-seq,其中编译器期望一个init-declarator-list。看到这个元素不合适导致编译器将该行视为不正确的。

该规范还注意到for循环相当于:

{
    for-init-statement
    while ( condition ) {
        statement
        expression ;
    }
}

其中condition被默认为“true”,如果省略。考虑这种“扩展”形式可能有助于确定给定的语法是否可以与for循环一起使用。

翻译自:https://stackoverflow.com/questions/3337126/in-c-why-cant-i-write-a-for-loop-like-this-for-int-i-1-double-i2-0

转载注明原文:在C中为什么我不能这样写一个for()循环:for(int i = 1,double i2 = 0;