【问题标题】:Increment operator ++ [duplicate]增量运算符 ++ [重复]
【发布时间】:2012-11-23 01:32:02
【问题描述】:

可能重复:
post increment operator java
What is x after “x = x++”?

谁能解释一下以下每个小程序的结果? :

public static void main(String[] args) {
    int a = 10;
    a = a++;
    System.out.println(a);
}

结果是:10

为什么不是 11,因为 a 应该在分配后增加?是不是涉及到operator=左右不同的变量?

下一个:

public static void main(String[] args) {
    int a = 10;
    a = ++a;
    System.out.println(a);
}

结果是:11

可以理解,但编译器会显示警告:“对变量 a 的赋值无效”。结果不同意。

更新:

我没有修改我原来的问题,但我添加了这条评论以澄清现在我明白了警告的含义。也就是说,即使没有赋值(通过简单的语句 ++a),结果也是相同的(11)。

【问题讨论】:

  • 故事的寓意;不要这样做,因为它可能会造成混淆。
  • 这是你的一半答案:What is x after “x = x++”?
  • 警告是有道理的,因为您分配了 a 包含的内容(在它增加之后)。这就像 a=a+1 ; a=a ;
  • @PeterLawrey 错了,故事的寓意是:RTFM
  • @Anzeo 我更倾向于观点;如果您发现代码令人困惑,请不要编写它,因为即使 RTFM 会告诉您它的作用,其他人也可能会对此感到困惑。

标签: java increment assignment-operator


【解决方案1】:

a++ 的值为a++ 的优先级高于 =。所以:

  1. 取值a
  2. a 递增。
  3. (1) 处的值存储到a

所以a 的值不会改变。

你可以自己弄清楚第二种情况会发生什么。

【讨论】:

    【解决方案2】:

    在第一种情况下,赋值首先发生,然后递增。所以你得到了增量之前的价值。但在第二种情况下,它首先增加然后被分配。

    【讨论】:

      【解决方案3】:

      让我们分析每种方式产生的字节码-

      int a = 10;
      a = a++;
      System.out.println(a); //Output - 10 
      

      产生的字节码 -

      0 bipush
      2 istore_1
      3 iload_1 
      4 iinc      
      7 istore_1
      8 getstatic
      11 iload_1
      12 invokevirtual
      15 return
      

      int a = 10;
      a = ++a;
      System.out.println(a); //Output -11
      

      这里编译器给出警告 - 对变量 a 的赋值无效

      产生的字节码 -

      0 bipush
      2 istore_1
      3 iinc
      6 iload_1
      7 istore_1
      8 getstatic
      11 iload_1
      12 invokevirtual
      15 return
      

      在第一种情况下,我们可以看到变量首先加载然后递增,因此它不会对variable a 产生任何影响。

      在第二种情况下,它首先递增然后加载变量,使其生效。

      【讨论】:

      • +1 看看操作码是什么样子的好主意,这是我们所有人的终极真理:)。但是,“作为第二种情况,它首先递增然后加载变量,因此它得到了递增的效果。”表明 OP 描述的警告没有任何意义,但确实如此。
      • 基本上我只是不希望对编译器进行 2 写操作,因此请避开它。 ;)
      【解决方案4】:

      这是因为 a++ 更像是一个方法而不是一个现实的数字。

      您可以将它们分成两行。

      第一个是

      a = a;
      return a + 1;
      

      第二个是

      a = a+1;
      

      【讨论】:

      • 错了。第一个结果是 10,而不是 11。
      • 而且“更像是一个方法而不是一个现实的数字”是没有意义的。而且您的编辑仍然是错误的。
      • 是的,对不起,我只写了两次,我确实清除了它
      【解决方案5】:

      a++ 表示增加变量a 的值,而a++ 原来的值是a!

      a = ?? 表示将a 的值设置为??

      所以你正在做的是将 a 的值加一,然后将其设置为旧值。

      ++a 表示增加变量a 的值,而++a 的值是a!

      因此,在第二个示例中,您要增加 a 的值,然后将 a 的值设置为该值(它刚刚获得),因此您要做两次相同的操作。

      【讨论】:

        【解决方案6】:

        a++ 等价于a = a + 1,但在表达式中使用值后递增(此处为赋值)++a 相同,但在表达式中使用之前递增。 a = ++a; 没有显式赋值影响,因为它等于 a = a = a + 1

        【讨论】:

          【解决方案7】:

          当您编写a++ 时,这意味着在处理了“=”运算符之后将递增。所以

          b = a++;
          System.out.println(a);
          System.out.println(b);
          

          应该在你的屏幕上产生:11, 10。因为a 在 b 取 'a' 的值后变成 11。如果您将 a++ 更改为 ++a 您会强制在处理“=”之前发生增量,因此您将给出 b = a + 1 并且在您的屏幕上应该有 11,11。

          【讨论】:

          • ++ 在程序通过当前行后不会增加,但在 ++ 运算符操作的项被计算之后。因此,在更复杂的术语中,例如 b=(a++)++,这会有所不同。
          • 错了。与当前行无关。
          • 它确实与这个简单的例子有关 => 更容易理解。我知道多个运营商的推定失败,但他只是问了不同之处。
          • @LonWolf 我再说一遍:它与线条没有任何关系。它与 Java 语言的定义语义有关,none 取决于行。
          • @TheBlastOne (a++)++ 不是合法的 Java 代码。 ++ 的操作数是变量,不是值。
          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 2016-02-02
          • 1970-01-01
          • 2019-09-25
          • 2013-06-06
          • 2017-07-06
          • 2017-06-23
          • 1970-01-01
          相关资源
          最近更新 更多