考慮下面的代碼:爲什麼會運行以下代碼?
int x = 0;
for(System.out.println("Confuse!"); Math.random()>0.5; x--)
{
}
我對這個代碼是如何編譯挺納悶的(實際打印「混淆!」)。這背後的解釋是什麼?難道我們在for循環(啓動;條件;增量)的情況下是這樣嗎?我們不應該在那裏定義一個int變量嗎?或者這並不重要,啓動可以是任何事情?
考慮下面的代碼:爲什麼會運行以下代碼?
int x = 0;
for(System.out.println("Confuse!"); Math.random()>0.5; x--)
{
}
我對這個代碼是如何編譯挺納悶的(實際打印「混淆!」)。這背後的解釋是什麼?難道我們在for循環(啓動;條件;增量)的情況下是這樣嗎?我們不應該在那裏定義一個int變量嗎?或者這並不重要,啓動可以是任何事情?
事實上,在for
環1 ST部分是初始化部分,不束縛你只有初始化表達式存在。你可以在那裏有任何有效的表達。例如,甚至可以得到增量表達那裏,像在下面的情況:
int i = 0;
for (++i; i < 10; i++) {
}
的1 ST部分僅執行一次。它可以初始化i
至0
。但是我們已經在外面完成了。在這裏,我們剛剛通過1
遞增i
。
詳情請參閱JLS §14.14.1 - Basic for
statement在此:
BasicForStatement:
for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement
ForStatementNoShortIf:
for (ForInitopt ; Expressionopt ; ForUpdateopt) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
作爲指定,ForInit
部分可以是有效表達,或一個局部變量聲明的列表。你不能擁有兩個。方法調用是一個有效的表達式,因此它在那裏是完全有效的語法。見JLS §14.8 - Expression Statements
這裏有一個更加混亂的例子表示表達式列表:
for (System.out.println("World"),System.out.println("Hello"); i < 10; i++) { }
你注意到2條print語句被逗號分隔?這是一個有效的for
聲明。它將打印"World"
,然後是"Hello"
。
現在,您可以嘗試將局部變量聲明以及那裏的print語句或增量語句放在一起,您將看到它失敗。
您可能想要說明的是,如果您使用局部變量聲明,則不能鏈接任何其他類型的表達式。舉一個例子:) –
@SotiriosDelimanolis對於語法來說這不是很明顯嗎?我應該添加嗎? –
語法表對您和我來說都是描述性的,但是對-5用戶來說可能不是。我會。無論如何,我都喜歡你。 –
[For loop](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html) –
爲什麼認爲它*不會運行? –