Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';赋值的左侧不是增量表达式吗?_Java_Arrays - Fatal编程技术网

Java 为什么可以';赋值的左侧不是增量表达式吗?

Java 为什么可以';赋值的左侧不是增量表达式吗?,java,arrays,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]的值增加1”并返回旧值。因此,您的代码首先使用arr[i]=i+1将arr[i]设置为i+1。然后使用arr[i]++

有谁能告诉我以下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]
的值增加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
arr[i]++
将arr[i]增加1。可能是这样的:

arr[i] = i + 1;
至于
arr[i]+=i+1请不要尝试编写此类代码。即使它能编译,对你或其他人来说都是个谜

另外,我更喜欢:

++arr[i];

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


至于
arr[i]+=i+1
这个短语的意思完全不同,老实说,我不知道它是否是有效的java。如果它有效,我会将arr[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。

这里讨论的操作符称为后缀增量操作符()。规定其行为如下:

  • 在运行时,如果操作数表达式的求值突然完成,则后缀增量表达式也会因为相同的原因突然完成,并且不会发生增量
  • 否则,将值1添加到变量的值中,并将总和存储回变量中。
  • 在添加之前,对值1和变量值执行二进制数字提升(§5.6.2)
  • 如有必要,在存储变量之前,通过缩小原语转换(§5.1.3)和/或对变量类型进行装箱转换(§5.1.7),缩小总和
  • 后缀增量表达式的值是存储新值之前变量的值
  • 最后一点是这个问题的关键:你为什么不能做
    arr[i]++=v
    就是你不能做
    x++=v的原因;后缀增量表达式返回值,而不是变量

    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]"
    
    发件人:

    当计算(执行)程序中的表达式时,结果表示以下三项之一:

    • 变量[…](在C中,这称为左值)
    • 值[…]
    • 无(该表达式被称为无效)
    赋值在左边需要一个变量,而值不是变量,这就是为什么不能执行
    x++=v

    发件人:

    赋值运算符的第一个操作数的结果必须是变量,否则会发生编译时错误。此操作数可以是命名变量[…],也可以是计算变量,这可能是字段[…]或数组访问的结果。[……]

    以下代码段显示了错误的赋值尝试,从非常细微到更明显:

    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]=arr[i]+1
    。但是它说,
    arr[i]=i+1
    。这是不同的。在java代码中从未见过这样的编码风格(在方括号内有空格)。作为旁注,++运算符的字节码取决于是否在局部int变量上使用,以及是否使用结果。最简单的情况是局部int变量的裸增量,其中生成一条增量指令。对数组成员进行后增量的情况会生成一些最复杂的字节码。(我不能评论任何JIT转换。)但是
    ++arr[I]
    将打印一个不同的结果作为
    arr[I]+
    。是的,你是对的。我会在一行中增加:
    ++arr[I]
    ,在另一行中打印。我认为这将更具可读性。