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

2021-12-09 00:00:00 loops c++

或者,在 for 循环中声明多个变量是禁止的"?!

or, "Declaring multiple variables in a for loop ist verboten" ?!

我的原始代码是

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

我想遍历第一个这么多方格,并且想要数字和它的方格,停止条件取决于方格.这段代码似乎是最清晰的意图表达,但它是无效的.我可以想到十几种方法来解决这个问题,所以我不是在寻找最佳选择,而是为了更深入地了解为什么这是无效的.如果愿意,可以学习一些语言法律方面的知识.

I wanted to loop through the first so-many squares, and wanted both the number and its square, and the stop condition depended on the square. This code seems to be the cleanest expression of intent, but it's invalid. I can think of a dozen ways to work around this, so I'm not looking for the best alternative, but for a deeper understanding of why this is invalid. A bit of language lawyering, if you will.

我年纪大了,还记得你必须在函数开始时声明所有变量的时候,所以我很感激

I'm old enough to remember when you had to declare all your variables at the start of the function, so I appreciate the

for( int i = 0; ....

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

syntax. Reading around it looks like you can only have one type declaration in the first section of a for() statement. So you can do

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

甚至略带巴洛克风格

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

但不是对我敏感的

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

有人知道为什么吗?这是 for() 的限制吗?或者对逗号列表的限制,例如逗号列表的第一个元素可以声明一个类型,但不能声明另一个?以下逗号的使用是否与 C++ 的不同语法元素不同?

Does anyone know why? Is this a limitation of for()? Or a restriction on comma lists, like "the first element of a comma list may declare a type, but not the other? Are the following uses of commas distinct syntactical elements of C++?

(A)

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

(乙)

int i = 0, j = 0;

(C)

 int z;
 z = 1, 3, 4;

那里有大师吗?

根据我得到的好评,我想我可以尖锐地提出这个问题:

Based on the good responses I've gotten, I think I can sharpen the question:

在 for 语句中

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

什么是 X、Y 和 Z?

what are X, Y and Z?

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

My question was about C++, but I don't have a great C++ refrence. In my C reference (Harbison and Steele 4th ed, 1995), they are all three expressions, and my gcc requires C99 mode to use for( int i = 0;

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

In Stroustrup, sec 6.3, the for statement syntax is given as

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

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

因此,C++ 有一个专门用于 for() 中的第一个子句的特殊语法语句,我们可以假设它们具有除表达式之外的特殊规则.这听起来有效吗?

So C++ has a special syntactic statement dedicated to the first clause in for(), and we can assume they have special rules beyond those for an expression. Does this sound valid?

推荐答案

int i = 1, double i2 = 0; 不是有效的声明语句,因此不能在 for 语句.如果语句不能独立于 for 之外,那么它就不能在 for 语句内使用.

int i = 1, double i2 = 0; is not a valid declaration statement, so it cannot be used inside the for statement. If the statement can't stand alone outside the for, then it can't be used inside the for statement.

关于逗号运算符的问题,选项A"和B"是相同的,并且都是有效的.选项C"也有效,但可能不会达到您的预期.z 将被赋值为 1,并且语句 34 实际上不会做任何事情(你的编译器会可能会警告您没有效果的语句"并优化它们).

Regarding your questions about comma operators, options 'A' and 'B' are identical and are both valid. Option 'C' is also valid, but will probably not do what you would expect. z will be assigned 1, and the statements 3 and 4 don't actually do anything (your compiler will probably warn you about "statements with no effect" and optimize them away).

更新:为了解决您编辑中的问题,以下是 C++ 规范(第 6.5 节)定义了 for:

Update: To address the questions in your edit, here is how the C++ spec (Sec 6.5) defines for:

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

它进一步将 for-init-statement 定义为 expression-statementsimple-declaration.conditionexpression 都是可选的.

It further defines for-init-statement as either expression-statement or simple-declaration. Both condition and expression are optional.

for-init-statement 可以是任何有效的 expression-statement(例如 i = 0;)或 simple-declaration(如int i = 0;).根据规范,语句 int i = 1, double i2 = 0; 不是有效的 simple-declaration,因此与 一起使用是无效的.作为参考,simple-declaration 被定义为(在第 7 节中):

The for-init-statement can be anything that is a valid expression-statement (such as i = 0;) or simple-declaration (such as int i = 0;). The statement int i = 1, double i2 = 0; is not a valid simple-declaration according to the spec, so it is not valid to use with for. For reference, a simple-declaration is defined (in Section 7) as:

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

其中 decl-specifier-seq 将是数据类型加上诸如 staticexterninit-declarator-list 之类的关键字 将是一个逗号分隔的声明符列表及其可选的初始值设定项.尝试将多个数据类型放入同一个 simple-declaration 实质上是在编译器需要 init-declarator-list<的地方放置了一个 decl-specifier-seq/代码>.看到这个元素不合适会导致编译器将该行视为格式错误.

where decl-specifier-seq would be the data type plus keywords like static or extern and init-declarator-list would be a comma-separated list of declarators and their optional initializers. Attempting to put more than one data type in the same simple-declaration essentially places a decl-specifier-seq where the compiler expects a init-declarator-list. Seeing this element out of place causes the compiler to treat the line as ill-formed.

规范还指出,for 循环等效于:

The spec also notes that the for loop is equivalent to:

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

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

where condition defaults to "true" if it is omitted. Thinking about this "expanded" form may be helpful in determining whether a given syntax may be used with a for loop.

相关文章