Java中i += ++i结果为1的原因?自增表达式相关疑问
Java自增表达式执行逻辑解析
1. 表达式i += ++i的输出为什么是1?
给定代码:
int i = 0; i += ++i; System.out.println(i);
Java中+=运算符的执行规则是:先保存左侧变量的当前值,再计算右侧表达式,最后将两者的和赋值给左侧变量。具体步骤:
- 第一步:保存左侧
i的当前值,也就是0; - 第二步:执行右侧的
++i,i自增为1,右侧表达式结果是1; - 第三步:将保存的0和右侧的1相加,得到1,赋值给
i,最终输出1。
2. 表达式i = i + ++i的执行结果与自增的内存变化
首先明确:++i是前置自增,一定会立即修改内存中i的值,但这个表达式的结果不是2,而是1。原因是Java对表达式的操作数遵循从左到右的求值顺序:
给定初始i=0,执行i = i + ++i的步骤:
- 第一步:计算第一个
i,取当前值0; - 第二步:执行
++i,i的内存值变为1,这个操作数的结果是1; - 第三步:将0和1相加得到1,赋值给
i,最终i的值是1。
你误以为结果是2,是假设了先执行所有自增再计算总和,但Java的求值顺序是严格从左到右处理每个操作数,不是先完成所有自增操作。
3. 不同编程语言的差异
Java、C#这类语言严格定义了表达式的求值顺序,所以这类自增表达式的结果是确定的。
但在C/C++中,i = i + ++i这类属于未定义行为——标准没有规定操作数的求值顺序,不同编译器、不同编译选项可能得到不同结果,比如有的编译器会先算++i再算左边的i,结果就是2,有的则和Java一样得到1。这种差异是因为不同语言的标准对表达式求值规则的定义不同。
4. 表达式i = i + ++i + i的执行结果
假设初始i=0,按Java的求值顺序:
- 第一步:取第一个
i的值0; - 第二步:执行
++i,i变为1,取这个操作数的值1; - 第三步:取第三个
i的值(此时i已经是1); - 第四步:计算总和0+1+1=2,赋值给
i,最终i的值是2。
内容的提问来源于stack exchange,提问作者Humanware
相关产品推荐
相关产品推荐

