“x = x ++”后的x是什么?

执行此操作后会发生什么(幕后)?

int x = 7;
x = x++;

也就是说,当一个变量在一个语句中增加后分配给自己? 我编译并执行了这个。 即使在整个陈述之后, x仍然是7。 在我的书中,它说x增加了!


x确实增加了。 但是你将x的旧值重新分配给自己。

x = x++;

x++递增x并返回其旧值。 x =将旧值重新分配给自己。

所以最后, x被赋值回它的初始值。


x = x++;

相当于

int tmp = x;
x++;
x = tmp;

该声明:

x = x++;

相当于:

tmp = x;   // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
           //     happens after the value is captured.
x = tmp;   // ... this is the effect of assignment operation which is
           //     (unfortunately) clobbering the incremented value.

简言之,该声明不起作用。

关键点:

  • 后缀增量/减量表达式的值是增量/减量发生前操作数的值。 (在前缀形式的情况下,该值是该操作之后的操作数的值)

  • 在将值分配给LHS之前,赋值表达式的RHS将被完全评估(包括任何增量,减量和/或其他副作用)。

  • 请注意,与C和C ++不同,Java中表达式的评估顺序是完全指定的,并且没有平台特定变体的空间。 只有当编译器不会从当前线程的角度更改执行代码的结果时,才允许对操作进行重新排序。 在这种情况下,编译器将被允许优化整个语句,因为它可以证明它是无操作的。


    如果它不是很明显:

  • “x = x ++;” 在任何程序中几乎肯定是一个错误。
  • OP(对于原始问题!)可能意味着“x ++;” 而不是“x = x ++;”。
  • 在同一个变量上结合自动增加/减少和赋值的语句很难理解,因此应该避免它们的正确性。 根本没有必要写这样的代码。
  • 希望像FindBugs和PMD这样的代码检查工具将这样的代码标记为可疑。

    链接地址: http://www.djcxy.com/p/72203.html

    上一篇: What is x after "x = x++"?

    下一篇: how gets() work after scanf?