2017-05-27 151 views
-3

我想知道爲什麼這兩個代碼給出不同的結果;for循環無花括號在java

for(i = 1, j = 0; i < 10; i++) { 
    j += i; 
    System.out.println(i); 
} 

這個給出了1個包含和10個排除之間的數字。

for(i = 1, j = 0; i < 10; i++) 
    j += i; 
System.out.println(i); 

然而這個給出了10.我無法得到這個邏輯;

for() 
do_something; 
do_something_else; 

回答

1

這是因爲一個迭代的默認範圍是它後只以下行,你的情況的東西等同於 -

for(i=1, j=0;i<10;i++) { 
    j += i; 
} 
System.out.println(i); 

因此整個循環迭代,自那之後我的價值= = 10,這是你在第二種情況下的輸出。


在第一種情況下,這是很明顯的是,值被印刷在每次迭代,因此1至9(小於10):

for(i=1, j=0;i<10;i++){ 
    j += i; 
    System.out.println(i); 
} 
4

在第二個示例中,輸出位於for循環之外。沒有大括號的for循環僅包含以下語句。

1

環路沒有括號僅適用於下一個語句

所以:

for(i=1, j=0;i<10;i++) 
    j += i; 
System.out.println(i); 

相當於:

for(i=1, j=0;i<10;i++){ 
     j += i; 
} 
    System.out.println(i); 

i被定義出循環範圍的,所以它具有10

1

第一語句包含的代碼一個塊值的最後一個循環之後被遞增。一塊代碼被作爲一個單元處理。

要創建一個代碼塊,您應該在大括號之間插入語句。

如果沒有指定代碼塊,循環和條件表達式只處理它們下面的第一條語句。

因此:

// Both statements handled 10 times 
for(i = 1, j = 0; i < 10; i++) { 
    j += i; 
    System.out.println(i); 
} 

// Only the first statement handled 10 times, the second one is out of scope of the loop 
for(i = 1, j = 0; i < 10; i++) 
    j += i; 
System.out.println(i); 
3

for迴路中,while環,並且if語句(忽略else所有控制單個聲明

for ([ForInit];[Expressi上];[ForUpdate])聲明

for ({VariableModifier} UnannType VariableDeclaratorId:表達)聲明

while (表達)聲明

if (表達)聲明

這種說法可能是一個Block,即括號{}與多個語句。

所以,這段代碼都是一樣的:

for(i=1, j=0;i<10;i++) 
j += i; 
System.out.println(i); 
for(i=1, j=0;i<10;i++) 
    j += i; 
    System.out.println(i); 
for(i=1, j=0;i<10;i++) 
    j += i; 
System.out.println(i); 
for(i=1, j=0;i<10;i++) { 
    j += i; 
} 
System.out.println(i); 

前兩個是非常糟糕的,因爲他們隱藏(誤傳)的代碼結構。

許多人主張總是使用塊,以防止混淆和編碼錯誤。