問題描述
或者,在 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;的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!