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

执行此操作后会发生什么(窗帘后面)?

int x = 7;

x = x++;

也就是说,当一个变量后期递增并在一个语句中赋值给自己时? 我编译并执行了这个。 x即使在整个声明之后仍然是7。 在我的书中,它说x递增了!

17个解决方案

369 votes

x = x++;

相当于

int tmp = x;

x++;

x = tmp;

Prince John Wesley answered 2019-02-09T04:10:00Z

277 votes

x确实增加了。 但是您将旧值x重新分配给自身。

x = x++;

x增量x并返回其旧值。

x将旧值分配给自身。

所以最后,x被分配回其初始值。

Mysticial answered 2019-02-09T04:09:40Z

256 votes

该声明:

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.

简而言之,该声明无效。

关键点:

Postfix递增/递减表达式的值是增量/减量发生之前的操作数的值。 (在Prefix表单的情况下,该值是操作后操作数的值,)

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

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

如果还不是很明显:

“x = x ++;” 在任何程序中几乎肯定都是错误的。

OP(对于原始问题!)可能意味着“x ++;” 而不是“x = x ++;”。

在相同变量上组合自动加/减和赋值的语句很难理解,因此无论其正确性如何都应该避免。 根本不需要编写类似的代码。

希望像FindBugs和PMD这样的代码检查器会将这样的代码标记为可疑。

Stephen C answered 2019-02-09T04:11:38Z

33 votes

int x = 7;

x = x++;

它在C和Java中有未定义的行为,请参阅此答案。 这取决于编译器会发生什么。

user712092 answered 2019-02-09T04:12:05Z

16 votes

像++这样的结构表明您可能误解了++x运算符的作用:

// original code

int x = 7;

x = x++;

基于删除++运算符,让我们重写这个做同样的事情:

// behaves the same as the original code

int x = 7;

int tmp = x; // value of tmp here is 7

x = x + 1; // x temporarily equals 8 (this is the evaluation of ++)

x = tmp; // oops! we overwrote y with 7

现在,让我们重写它(我认为)你想要的:

// original code

int x = 7;

x++;

这里的细微之处在于++运算符修改变量++,与++x之类的表达式不同,后者将计算为int值但保持变量x++不变。 考虑像古老的for循环这样的构造:

for(int i = 0; i < 10; i++)

{

System.out.println(i);

}

请注意那里的++? 它是同一个运营商。 我们可以像这样重写这个++x循环,它会表现得一样:

for(int i = 0; i < 10; i = i + 1)

{

System.out.println(i);

}

在大多数情况下,我还建议不要在较大的表达式中使用++运算符。 由于它在前后增量(分别为++x和x++)中修改原始变量的微妙性,因此很容易引入难以追踪的细微错误。

FMM answered 2019-02-09T04:13:08Z

12 votes

根据从类文件中获取的字节代码,

两个赋值都增加x,但差值是Case2的时间

在Case2中,在增量之前发生推送(然后再指定)(本质上意味着您的增量不执行任何操作)

在Case2中,递增首先发生(使其成为8)然后推入堆栈(然后分配给x)

情况1:

int x=7;

x=x++;

字节代码:

0 bipush 7 //Push 7 onto stack

2 istore_1 [x] //Pop 7 and store in x

3 iload_1 [x] //Push 7 onto stack

4 iinc 1 1 [x] //Increment x by 1 (x=8)

7 istore_1 [x] //Pop 7 and store in x

8 return //x now has 7

案例2:

int x=7;

x=++x;

字节代码

0 bipush 7 //Push 7 onto stack

2 istore_1 [x] //Pop 7 and store in x

3 iinc 1 1 [x] //Increment x by 1 (x=8)

6 iload_1 [x] //Push x onto stack

7 istore_1 [x] //Pop 8 and store in x

8 return //x now has 8

这里的堆栈是指操作数堆栈,本地:x索引:1类型:int

EvenPrime answered 2019-02-09T04:14:15Z

8 votes

它在“x = x++;”之后递增。 如果你做“x = ++x;”,那就是8。

F.J answered 2019-02-09T04:14:41Z

7 votes

在调用x之后发生递增,因此x仍然等于7.当调用x时,++ x将等于8

JonPM answered 2019-02-09T04:15:07Z

7 votes

当您重新分配x的值时,它仍然是7.尝试x = ++x并且您将获得其他8个其他操作

x++; // don't re-assign, just increment

System.out.println(x); // prints 8

Vishal answered 2019-02-09T04:15:33Z

6 votes

因为x ++会在将值赋给变量后递增值。所以在执行这一行时:

x++;

变量x仍将具有原始值(7),但在另一行上再次使用x,例如

System.out.println(x + "");

会给你8。

如果要在赋值语句中使用递增的x值,请使用

++x;

这会将x递增1,然后将该值赋给变量x。

[编辑]而不是x = x ++,它只是x ++; 前者将x的原始值分配给它自己,所以它实际上在该行上没有任何作用。

josephus answered 2019-02-09T04:16:33Z

6 votes

Post Increment运算符的工作方式如下:

存储操作数的上一个值。

增加操作数的值。

返回操作数的先前值。

所以声明

int x = 7;

x = x++;

评估如下:

x用值7初始化

后增量运算符存储x的先前值,即7以返回。

增加x,所以现在x是8

返回x的先前值,即7,并将其分配回x,因此x再次变为7

所以x确实增加了,但是因为x ++将结果赋给x,所以x的值被覆盖到它之前的值。

GauravLuthra answered 2019-02-09T04:18:04Z

4 votes

++x时会发生什么?

ans - &gt; ++x表示首先使用x表示表达式,然后将其增加1。

这就是你的情况。 RHS上的x值复制到LHS上的变量x,然后值->增加1。

类似地,++x表示->首先将x的值增加1然后在表达式中使用。

所以在你的情况下,如果你这样做x = ++x ; // where x = 7

你会得到8的价值。

为了更清楚,请尝试找出有多少printf语句将执行以下代码

while(i++ <5)

printf("%d" , ++i); // This might clear your concept upto great extend

samprat answered 2019-02-09T04:19:11Z

3 votes

++x是预增量-> x在使用前递增

x++是后增量-> x在使用后递增

int x = 7; -> x get 7 value

x = x++; -> x get x value AND only then x is incremented

Roberto Martelloni answered 2019-02-09T04:19:46Z

1 votes

所以这意味着:x++不等于x = x+1

因为:

int x = 7; x = x++;

x is 7

int x = 7; x = x = x+1;

x is 8

现在看起来有点奇怪:

int x = 7; x = x+=1;

x is 8

非常依赖编译器!

linuxeasy answered 2019-02-09T04:20:30Z

-1 votes

我认为这个争议可以在不进入代码的情况下得到解决。 只是想。

考虑一下i ++&amp; ++ i作为函数,比如Func1&amp;FUNC2。

现在i = 7;

Func1(i ++)返回7,Func2(++ i)返回8(每个人都知道这一点)。 在内部,两个函数都将i递增到8,但它们返回不同的值。

所以i = i ++调用函数Func1。 在函数内部,我增加到8,但在完成时函数返回7。

所以最终7分配给我。 (所以最后,i = 7)

Pranav Mahajan answered 2019-02-09T04:21:33Z

-2 votes

x = x ++;

这是后增量运算符。 应该理解为“使用操作数的值然后递增操作数”。

如果要反转,即“递增操作数然后使用操作数的值”,则必须使用预增量运算符,如下所示。

x = ++ x;

此运算符首先将x的值递增1,然后将该值赋值回x。

deepak answered 2019-02-09T04:22:28Z

-2 votes

这是因为您使用了后增量运算符。在以下代码行中

x = x++;

会发生什么,你将x的值赋给x。 x的值分配给x后,x ++递增x。 这就是后增量运算符的工作方式。 它们在声明执行后工作。 所以在你的代码中,x先返回,然后再增加。

如果你这样做了

x = ++x;

答案是8,因为你使用了预增量运算符。 这会在返回x的值之前先递增该值。

Anon answered 2019-02-09T04:23:17Z

java x_java - “x = x ++”后的x是什么?相关推荐

  1. oracle不维护java_宣布 Java 8 停止维护后,Oracle 又毙掉了 JavaOne!

    原标题:宣布 Java 8 停止维护后,Oracle 又毙掉了 JavaOne! 上周,Oracle 宣布将在不久后将停止维护 Java 8.近日,又在开发者博客宣布取消 JavaOne 会议... ...

  2. java try catch 异常后还会继续执行吗

    java try catch 异常后还会继续执行吗? catch 中如果你没有再抛出异常 , 那么catch之后的代码是可以继续执行的 , 但是try中 , 报错的那一行代码之后 一直到try结束为止 ...

  3. java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码

    解决 JAVA WebSocket 解析 base64 后中文字符串乱码 解决 JAVA WebSocket 解析 base64 后中文字符串乱码 春风如贵客,一到便繁华.各位看官先赞再看,养成好习惯 ...

  4. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  5. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  6. 深入java虚拟机需要读吗_《深入理解Java虚拟机》读后总结(一)JVM内存模型

    <深入理解Java虚拟机>读后总结 基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线 ...

  7. JAVA ImageIO图片处理后变色

    JAVA ImageIO图片处理后变色问题 最初使用ImagIO.Read() 从InputStream 转成BufferImage 然后进行水印添加,普通图片没问题,但是当前端通过JS剪裁传入后就出 ...

  8. poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel

    java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...

  9. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

最新文章

  1. Pytorch完成基础的模型-线性回归
  2. 树莓派c语言访问mariadb,树莓派之MariaDB
  3. 多点子接口的帧中继配置(MP SubInterface FrameRealy)
  4. Spring入门5.事务管理机制
  5. StringBuilder String string.Concat 字符串拼接速度再议
  6. 人工智能秘史(一):会下棋的土耳其机器人
  7. python3 安装PIL
  8. js获取时间戳的几种方式
  9. 泛微云桥e-Bridge安装手册
  10. Computer Network Note
  11. InsecureProgramming-master——abo4
  12. 云信api_网易数帆开源贡献获业界肯定,轻舟API网关获OSCAR尖峰开源技术创新奖...
  13. [精简]托福核心词汇29
  14. 微信小程序开发一定要服务器么,该怎么选择小程序服务器?
  15. safari浏览器下载中文文件名出现的乱码问题
  16. Casbin之ABAC
  17. Java:Nginx使用
  18. 园区管理系统平台 V2.0 发布了
  19. 爱情不是等你有空才珍惜
  20. (一)库存计划-安全库存

热门文章

  1. 5 6c语言上机作业答案,(完整版)C语言考试题库及答案
  2. 数据分析 --- 收集数据的技巧
  3. linux 系统迁移到固态硬盘,在Linux系统中将SSD当块设备缓存的方法
  4. 防火墙软件Netfilter之包过滤技术(转)
  5. 解决CSS中display: inline-block有缝隙问题
  6. 武汉云数时代网络科技有限公司代运营具体需要做好哪些方面?
  7. Java 程序处理 去除文件中的NUL字符
  8. 如何解释“运维到底是干啥的”?
  9. Linux基础命令-tar打包压缩文件
  10. WGS84坐标系下,经纬度如何换算成米