[英]Why can't the left hand side of an assignment be an increment expression?
有没有人请告诉我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;
这里讨论的运算符称为后缀增量运算符( JLS 15.14.2 )。 它被指定为表现如下:
- 在运行时,如果操作数表达式的评估突然完成,则后缀增量表达式出于同样的原因突然完成,并且不会发生增量。
- 否则,将值1添加到变量的值中,并将总和存储回变量中。
- 在添加之前,对值1和变量的值执行二进制数字提升(第5.6.2节)。
- 如果必要,在存储之前,通过缩小的基元转换(第5.1.3节)和/或经过装箱转换(第5.1.7节)将总和缩小到变量的类型。
- 后缀增量表达式的值是变量的值被存储在新的值之前 。
最后一点是这个问题的关键:你不能做的原因arr[i]++ = v;
与你不能做x++ = v;
原因完全相同x++ = v;
; 后缀增量表达式返回一个值 ,而不是一个变量 。
当评估(执行)程序中的表达式时,结果表示以下三种情况之一:
- 变量[...](在C中,这将被称为左值)
- 一个值 [...]
- 没什么(表达被认为是无效的)
赋值需要在左侧的变量和值不是一个变量,这就是为什么你不能做x++ = v;
。
来自JLS 15.26分配运营商 :
赋值运算符的第一个操作数的结果必须是变量,否则会发生编译时错误 。 此操作数可以是命名变量[...],也可以是计算变量,可以来自字段[...]或数组访问。 [...]
以下代码段显示了错误的分配值的尝试,从相当微妙到更明显:
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]"
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;
因为它没有意义。
代码System.out.println(arr[i]++)
意味着:
int tmp = arr[i];
arr[i] = arr[i] + 1;
System.out.println(tmp);
你的第二个例子没有意义,因为你不能在值上使用++
运算符。
++运算符与数组无关。 它将任何整数变量(或更一般地,任何左值)递增1.它与循环中的i ++相同。
您可以编写++ x或x ++。 这些都增加x,但它们具有不同的值:++ x返回x的新值,x ++返回旧值。 因此,您的代码打印1,2,3,4而不是2,3,4,5。
arr[ i ]++
将arr [i]增加1.它可能是这样的:
arr[i] = i + 1;
至于arr[ i ]++ = i + 1;
请不要尝试编写此类代码。 即使它编译它也会让你或其他人感到困惑。
PS我更喜欢:
++arr[i];
arr [i] ++将arr [i]的值增加1并赋值
至于arr[ i ]++ = i + 1;
这句话意味着完全不同的东西,我不知道它甚至是有效的Java诚实。 如果它有效,我会在arr [i]中输入值,然后将其指向索引+ 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.