2010-03-14 99 views
5

可以在任何一個告訴我「++」的含義與數組在下面的代碼在Java中:爲什麼作業的左側不能是增量表達式?

int [ ] arr = new int[ 4 ]; 
    for(int i = 0; i < arr.length; i++){ 
     arr[ i ] = i + 1; 
     System.out.println(arr[ i ]++); 
    } 

什麼是在上面的代碼arr[ i ]++意義,爲什麼我們不能做這樣的:

arr[ i ]++ = i + 1; 
+1

在java代碼中從來沒有見過這種編碼風格(帶方括號內的空格)。 – Roman 2010-03-14 20:31:11

+0

作爲一個方面說明,++運算符的字節碼取決於它是否用於本地int變量,以及是否使用結果。最簡單的情況是生成一個本地int變量的簡單增量,在該變量中生成單個增量指令。你在提交數組成員後會生成一些最複雜的字節碼。(我不能評論任何JIT轉換。) – Neil 2010-03-14 21:54:32

回答

7

此處討論的運算符稱爲後綴增量運算符(JLS 15.14.2)。它被指定到的行爲如下:

  1. 在運行時,如果操作數表達式的計算突然完成,那麼後綴遞增表達突然完成出於同樣的原因,並沒有增量發生。
  2. 否則,將值1添加到變量的值中,並將總和存回變量。
    1. 在添加之前,對值1和變量的值執行二進制數值提升(第5.6.2節)。
    2. 如有必要,總和通過縮小原始轉換(§5.1.3)和/或受到裝箱轉換(§5.1.7)變爲存儲前的變量類型。
  3. 後綴增量表達式的值是存儲新值之前的變量的值

最後一點是這個問題的關鍵是:你爲什麼不能做arr[i]++ = v;的道理是一樣的確切原因,爲什麼你不能這樣做x++ = v;;後綴增量表達式返回,而不是變量

JLS 15.1 Evaluation, Denotation and Result

當在程序中的表達式求值(執行),所述結果表示三種情況之一:

  • 可變[...](在C,這將被稱爲左值)
  • 值[...]
  • 無(表達被認爲是無效)

的分配需要在左手側的可變和值不是一個變量,這就是爲什麼你不能這樣做x++ = v;

JLS 15.26 Assignment Operators

賦值操作符的第一操作數的結果必須是一個變量或編譯時錯誤發生。這個操作數可能是一個命名變量[...],或者它可能是一個計算變量,可能來自字段或數組訪問。 [...]

下面的代碼片段顯示錯誤嘗試分配給,從相當微妙要更明顯:

int v = 42; 
int x = 0; 
x = v;  // OKAY! 
x++ = v;  // illegal! 
(x + 0) = v; // illegal! 
(x * 1) = v; // illegal! 
42 = v;  // illegal! 
    // Error message: "The left-hand side of an assignment must be a variable" 

請注意,您可以使用的後綴遞增運算符某處位於賦值運算符的左側,只要最終結果是一個變量。

int[] arr = new int[3]; 
int i = 0; 
arr[i++] = 2; 
arr[i++] = 3; 
arr[i++] = 5; 
System.out.println(Arrays.toString(arr)); // prints "[2, 3, 5]" 
2

arr[i]++表示「將arr[i]的值增加1」並返回舊值。因此,您的代碼首先使用arr[ i ] = i + 1;arr[i]設置爲i+1。然後它使用arr[ i ]++將其增加到i + 2,並且在之前打印它在之前的值,它第二次增加,即i + 1

您不能使用arr[ i ] = arr[i] + 1;來代替,因爲它意味着「將arr[i]的值增加1並返回新值」。

你不能做arr[ i ]++ = i + 1;,因爲它沒有意義。

+1

代碼不會首先增加arr [i]的值。那將是'arr [i] = arr [i] + 1'。但它說'arr [i] = i + 1'。這是不同的。 – 2010-03-14 20:30:49

+0

@MarkByers:當然你是對的。固定。 – sepp2k 2010-03-14 20:40:40

0

arr[ i ]++增加ARR [I] 1。這可能是這樣的:

arr[i] = i + 1; 

至於arr[ i ]++ = i + 1;請不要嘗試寫這樣的代碼。即使編譯它,也會讓你或其他人感到困惑。

PS我寧願:

++arr[i]; 
+1

但是'++ arr [i]'會輸出與'arr [i] ++'不同的結果。 – 2010-03-14 21:52:14

+0

是的,你是對的。我會增加:'++ arr [i]'在一行中並在另一行中打印。我認爲這會更具可讀性。 – 2010-03-15 06:05:43

0

ARR [I] ++是由一個[I]增加ARR值並分配

作爲arr[ i ]++ = i + 1;這句話的意思完全不同的東西,我不知道它是誠實的,即使是有效的Java。如果它有效,我會在arr [i]處發現價值,然後將其作爲指數+1;

3

代碼System.out.println(arr[i]++)含義:

int tmp = arr[i]; 
arr[i] = arr[i] + 1; 
System.out.println(tmp); 

你的第二個例子是沒有意義的,因爲你不能使用++操作上的值。

2

++運算符與數組無關。它將任何整數變量(或更一般地說,任何左值)加1。它與循環中的i ++相同。

您可以編寫++ x或x ++。這些都是遞增x,但它們具有不同的值:++ x返回x的新值,x ++返回舊值。因此,您的代碼將打印1,2,3,4而不是2,3,4,5。

相關問題