【问题标题】:Post Increment and assigning to same variable [duplicate]发布增量并分配给相同的变量[重复]
【发布时间】:2017-07-04 15:10:09
【问题描述】:
int b = 2;

c= b++;
System.out.Println("C :"+c+"B"+b);

c 将是 2,b 将是 3。

int b = 2;

b= b++;
System.out.Println("B:"+b);

在这里,我想知道什么是递增的。以及增加的值去哪里了。

【问题讨论】:

  • 因为是b++,所以b在语句被“处理”后会增加,值会转到指定的地方;在这些示例中,它不会出现在其他任何地方。
  • 这里重要的是b++b = b + 1是一回事。
  • 因为我之前的回答是错误的。我将链接更好的解释:stackoverflow.com/questions/27621242/…

标签: java


【解决方案1】:

这很棘手。让我们看一下后自增运算符的作用。 JLS 声明:

后缀自增表达式的值是新值存储前变量的值。

所以在您的代码中b++ 的值是2,独立于b 的增量。

如果您进行赋值,则首先计算右侧的表达式,然后将其值存储到变量中。

c = b++ 很简单。表达式b++ 的值2 被分配给c。在该语句之后b 具有递增值3。但这有点简化。实际发生的是,首先评估 b++,这意味着 b 在分配发生之前之前递增,而不是之后。

那么当您执行b = b++ 时会发生什么?好吧,它是一样的:首先评估 b++,这意味着 b 递增。之后进行赋值并将表达式b++值赋值给b。这仍然是 2 并覆盖您递增的 b

有趣的事实:如果我在 Eclipse 中输入您的第二个代码,Findbugs 会发出以下警告:

错误:MyClass.main(String[]) 中的增量被覆盖

代码执行增量操作(例如,i++),然后立即覆盖它。例如,i = i++ 立即用原始值覆盖增加的值。

【讨论】:

  • 好吧,Eclipse 需要一个插件来发现增量未被使用因此是多余的,这甚至不好玩。但这只是 Eclipse :/.
  • @Tom 你知道有一个开箱即用的 IDE 会发出警告吗? (免责声明:诚实的问题,而不是试图发起 IDE 战争:D)
  • IntelliJ Idea 做到了。它有一套完整的检查和未使用的分配(如String s = "A"; s = "B";i = i++;)就是其中之一。
  • @Tom 很好。 Eclipse 确实显示了一些这样的东西,但没有显示这种特殊情况。无论如何,我总是使用 Findbugs,因为它会发现很多不那么明显的东西。
  • Eclipse 支持这样的插件是一件好事,它们肯定应该被使用,但我更喜欢一些已经在 Eclipse 中实现的核心功能。但这只是口味问题。插件仍然可以提供相同的功能。
【解决方案2】:

我猜你只是不明白这里发生了什么:

int b = 2;

b= b++;
System.out.println("B:"+b);

更具体地说,这一行:

b = b++;

编译器看到这是一个赋值语句,所以它首先尝试计算右边的表达式:

b++

由于这里的++ 是一个后自增运算符,因此该表达式的计算结果为b,即2。在计算之后,b 立即增加为3。

我们还没有完成!这是一个赋值语句还记得吗?现在计算了右侧,表达式现在看起来像这样:

b = 2;

太棒了!现在b 被赋值为2

【讨论】:

    【解决方案3】:
    int b=2    
    b = b++
    

    就像你在运行这段代码

    int b = 2;
    int temp = b;
    b = b + 1;
    b = temp;
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2020-11-22
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多