【新手问题】关于运算符

真祖_爱尔奎特 2013-03-22 01:25:26
public class class2 {
public static void main(String args[]){
int h=4;
h+=h-=h*h;
System.out.println("-----h:"+h);
}
}
这里为什么在最终结果出来之前h参与中间运算的值始终是4,在做完h-=h*h这个后h的值不会变么?
这个问题在C语言里貌似是属于“未定义行为”,编译器会发出警告.java为什么不报错呢?
...全文
361 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq769568569 2013-03-29
  • 打赏
  • 举报
回复
这样的代码有意义吗?你想表达什么意思,直接加个括号,不就得了
小绵羊 2013-03-29
  • 打赏
  • 举报
回复
引用 10 楼 shine333 的回复:
Java Language Specification里面规定的: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7 Plain Text code?1234515.7.1. Evaluate Left-Hand Operand First The left-hand op……
我是来支持坦克哥的
小-人-物 2013-03-29
  • 打赏
  • 举报
回复
如果我在程序里发现了楼主发的这种表达式,那个程序员哥们,会残疾的!
iluvsnail 2013-03-29
  • 打赏
  • 举报
回复
这种题目没什么意思啊
ceclinux 2013-03-27
  • 打赏
  • 举报
回复
实际上我不知道这样的代码有何意义,没有什么可读性,玩弄技巧罢了
lg_asus 2013-03-27
  • 打赏
  • 举报
回复
引用 10 楼 shine333 的回复:
Java Language Specification里面规定的: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7

15.7.1. Evaluate Left-Hand Operand First 

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated. 

If the operator is a compound-assignment operator (§15.26.2), then evaluation of the left-hand operand includes both remembering the variable that the left-hand operand denotes and fetching and saving that variable's value for use in the implied binary operation.
简而言之,二元运算符左面部分必须在右面之前演算。 如果是个复合型的赋值预算 +=,-=, *= .....,符号左边的部分(也就变量名那部分)会先将变量当时的值先保存下来,然后再运行右面的表达式,最后再赋值。
int h=4;
h+=(h+=1)+(h-=h*h); // 这行5个h,分别叫做h1~h5
运算的顺序是: h1=4,结果4暂时保存x (h2=4)+1 = 5,写入h,结果5暂时保存y h3=5,5暂时保存 h4=5, h5=5, 5*5=25 5-25=-20,写入h,结果-20暂时保存z 读出刚才保存的y=5和z=-20, y+z = 5 + -20 = -15 读出刚才保存的x=4,4 + -15 = -11 整个表达式及最后的h=-11
very good, I support you.
  • 打赏
  • 举报
回复
引用 9 楼 miaowhehe 的回复:
引用 2 楼 wangyonglin1123 的回复:大哥 不管是分开写还是在一起写 java算出来都是-8. 因为只有最后的计算出来值才赋值给h,其他的都引用的初始值。 哥们,我的解释可能是不准确的,但运算的结果不可能不经过验证就跟别人乱说的……都已经拆成两条语句了,第一条语句执行完后h的值已经变了,最终算出来就是-24,你可以运行一下看看。
嗯 对 结果是-24,我看错了
itjobcom 2013-03-23
  • 打赏
  • 举报
回复
h+=h-=h*h;其实可以分解为: h+=h-=16; h+=4-16; h=h+(4-16); h=4-12; h=-8;
shine333 2013-03-23
  • 打赏
  • 举报
回复
当然,这种模棱两可,容易产生误解的写法,无论什么语言,都应该避免
shine333 2013-03-23
  • 打赏
  • 举报
回复
运算的顺序是: h1=4,结果4暂时保存x (h2=4)+1 = 5,写入h从此之后h的值,也就是h3~h5=5,结果5暂时保存y h3=5,5暂时保存 h4=5, h5=5, 5*5=25 5-25=-20,写入h,结果-20暂时保存z 读出刚才保存的y=5和z=-20, y+z = 5 + -20 = -15 读出刚才保存的x=4,4 + -15 = -11 整个表达式及最后的h=-11
shine333 2013-03-23
  • 打赏
  • 举报
回复
Java Language Specification里面规定的: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7

15.7.1. Evaluate Left-Hand Operand First 

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated. 

If the operator is a compound-assignment operator (§15.26.2), then evaluation of the left-hand operand includes both remembering the variable that the left-hand operand denotes and fetching and saving that variable's value for use in the implied binary operation.
简而言之,二元运算符左面部分必须在右面之前演算。 如果是个复合型的赋值预算 +=,-=, *= .....,符号左边的部分(也就变量名那部分)会先将变量当时的值先保存下来,然后再运行右面的表达式,最后再赋值。
int h=4;
h+=(h+=1)+(h-=h*h); // 这行5个h,分别叫做h1~h5
运算的顺序是: h1=4,结果4暂时保存x (h2=4)+1 = 5,写入h,结果5暂时保存y h3=5,5暂时保存 h4=5, h5=5, 5*5=25 5-25=-20,写入h,结果-20暂时保存z 读出刚才保存的y=5和z=-20, y+z = 5 + -20 = -15 读出刚才保存的x=4,4 + -15 = -11 整个表达式及最后的h=-11
miaowhehe 2013-03-23
  • 打赏
  • 举报
回复
引用 2 楼 wangyonglin1123 的回复:
大哥 不管是分开写还是在一起写 java算出来都是-8. 因为只有最后的计算出来值才赋值给h,其他的都引用的初始值。
哥们,我的解释可能是不准确的,但运算的结果不可能不经过验证就跟别人乱说的……都已经拆成两条语句了,第一条语句执行完后h的值已经变了,最终算出来就是-24,你可以运行一下看看。
  • 打赏
  • 举报
回复
引用 3 楼 zxd297139205 的回复:
貌似是运算符的优先级问题; int h=4; h+=h-=h*h; 等效于: int h=4; h+=h-=16; 从左往右计算: (h+=h)-=16 等效于: h=8; h-=16; 最后得到h=-8
这种解释是错的,运算顺序是从右往左的,你这个-8完全是碰巧得到的结果.
  • 打赏
  • 举报
回复
引用 6 楼 soton_dolphin 的回复:
h+=h-=h*h; 1, h*h = 4 * 4 = 16 2, h = h - 16 (因为h*h没有赋值给h,所以现在的h仍然等于4) 即 h = 4 - 16 = -12 现在 h = -12 3. h = h + h = -12 + -12 = -24
这种解释是错的,h值在参与运算时始终是4,最终结果是-8.
soton_dolphin 2013-03-22
  • 打赏
  • 举报
回复
h+=h-=h*h; 1, h*h = 4 * 4 = 16 2, h = h - 16 (因为h*h没有赋值给h,所以现在的h仍然等于4) 即 h = 4 - 16 = -12 现在 h = -12 3. h = h + h = -12 + -12 = -24
soton_dolphin 2013-03-22
  • 打赏
  • 举报
回复
如果我在程序里发现了楼主发的这种表达式,那个程序员一户口本儿的成员都会被我问候一遍
kang_zz 2013-03-22
  • 打赏
  • 举报
回复
h = h+h-h*h; -8
zxd297139205 2013-03-22
  • 打赏
  • 举报
回复
貌似是运算符的优先级问题; int h=4; h+=h-=h*h; 等效于: int h=4; h+=h-=16; 从左往右计算: (h+=h)-=16 等效于: h=8; h-=16; 最后得到h=-8
  • 打赏
  • 举报
回复
引用 1 楼 miaowhehe 的回复:
Java算出来是-8,C/C++算出来是-24。 应该是它们为h赋值的时机不太一样吧。 我们可以分开写,避免歧义: h -= h * h; h += h; 这样Java算出来也是-24。
大哥 不管是分开写还是在一起写 java算出来都是-8. 因为只有最后的计算出来值才赋值给h,其他的都引用的初始值。
miaowhehe 2013-03-22
  • 打赏
  • 举报
回复
Java算出来是-8,C/C++算出来是-24。 应该是它们为h赋值的时机不太一样吧。 我们可以分开写,避免歧义: h -= h * h; h += h; 这样Java算出来也是-24。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧