为什么赋值的左侧不能是增量表达式?

时间:2010-03-14 19:59:25

标签: java arrays

任何人都可以在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;

6 个答案:

答案 0 :(得分:7)

此处讨论的运算符称为后缀增量运算符(JLS 15.14.2)。指定行为如下:

  
      
  1. 在运行时,如果操作数表达式的评估突然完成,则后缀增量表达式会因同样的原因而突然完成,并且不会发生增量。
  2.   
  3. 否则,将值1添加到变量的值中,并将总和存储回变量中。      
        
    1. 在添加之前,对值1和变量值执行二进制数字提升(第5.6.2节)。
    2.   
    3. 如果需要,在存储之前,通过缩小的基元转换(第5.1.3节)和/或经过装箱转换(第5.1.7节)缩小总和变量的类型。
    4.   
  4.   
  5. 在存储新值之前,后缀增量表达式的值为变量的值
  6.   

最后一点是这个问题的关键:你不能做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]"

答案 1 :(得分:2)

arr[i]++表示“将arr[i]的值增加1”并返回旧值。因此,您的代码首先使用arr[i]i+1设置为arr[ i ] = i + 1;。然后使用i + 2将其增加到arr[ i ]++,并在第二次增加之前打印的值,即i + 1

您不能使用arr[ i ] = arr[i] + 1;,因为它意味着“将arr[i]的值增加1并返回新值”。

你不能arr[ i ]++ = i + 1;,因为它没有意义。

答案 2 :(得分:2)

代码System.out.println(arr[i]++)表示:

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

您的第二个示例没有意义,因为您无法在值上使用++运算符。

答案 3 :(得分:1)

++运算符与数组无关。它将任何整数变量(或更一般地,任何左值)递增1.它与循环中的i ++相同。

您可以编写++ x或x ++。这些都增加x,但它们具有不同的值:++ x返回x的新值,x ++返回旧值。因此,您的代码打印1,2,3,4而不是2,3,4,5。

答案 4 :(得分:0)

arr[ i ]++将arr [i]增加1.这可能是:

arr[i] = i + 1;

至于arr[ i ]++ = i + 1;,请不要尝试编写此类代码。即使它编译它也会让你或其他人感到困惑。

PS我更喜欢:

++arr[i];

答案 5 :(得分:0)

arr [i] ++将arr [i]的值增加1并赋值

至于arr[ i ]++ = i + 1;这句话意味着完全不同的东西,我不知道它甚至是有效的java诚实。如果它有效,我会在arr [i]中输入值,然后将其指向索引+ 1;