2014-02-19 131 views
-5

考慮下面的代碼:爲什麼會運行以下代碼?

int x = 0; 
for(System.out.println("Confuse!"); Math.random()>0.5; x--) 
{ 
} 

我對這個代碼是如何編譯挺納悶的(實際打印「混淆!」)。這背後的解釋是什麼?難道我們在for循環(啓動;條件;增量)的情況下是這樣嗎?我們不應該在那裏定義一個int變量嗎?或者這並不重要,啓動可以是任何事情?

+4

[For loop](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html) –

+0

爲什麼認爲它*不會運行? –

回答

3

事實上,在for環1 ST部分是初始化部分,不束縛你只有初始化表達式存在。你可以在那裏有任何有效的表達。例如,甚至可以得到增量表達那裏,像在下面的情況:

int i = 0; 
for (++i; i < 10; i++) { 
} 

的1 ST部分僅執行一次。它可以初始化i0。但是我們已經在外面完成了。在這裏,我們剛剛通過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語句或增量語句放在一起,您將看到它失敗。

+0

您可能想要說明的是,如果您使用局部變量聲明,則不能鏈接任何其他類型的表達式。舉一個例子:) –

+0

@SotiriosDelimanolis對於語法來說這不是很明顯嗎?我應該添加嗎? –

+0

語法表對您和我來說都是描述性的,但是對-5用戶來說可能不是。我會。無論如何,我都喜歡你。 –

相關問題