问题描述
或者,在 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
,并且语句 3
和 4
实际上不会做任何事情(你的编译器会可能会警告您没有效果的语句"并优化它们).
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-statement
或 simple-declaration
.condition
和 expression
都是可选的.
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
将是数据类型加上诸如 static
或 extern
和 init-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.
这篇关于在 C++ 中,为什么我不能像这样编写 for() 循环: for( int i = 1, double i2 = 0;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!