2010-03-14 101 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。

相关问题