百科问答小站 logo
百科问答小站 font logo



a += a *= a; 为什么在C++和Java算出了不同结果? 第1页

  

user avatar   supersodasea 网友的相关建议: 
       C和JAVA在运算符优先级上有不同吗? - SuperSodaSea 的回答 - 知乎

简单地说,在Java中对于复合赋值操作符会先对左侧操作数进行求值,随后对右侧操作数进行求值,最后将两个值进行运算并赋值给左侧操作数。(

JLS8 15.7.1 左侧操作数首先求值

也就是说在 a += a *= a; 中,会先从左到右求出三个 a 的值(均为12),然后将后两个值相乘得到144,并赋值给 a,最后将第一个值(注意这里用的不是144而是最开始得到的12)和144相加得到156,并赋值给 a。最终 a = 156。

对于C++来说,在C++17之前,这是未定义行为。而在C++17中对于这种表达式的计算顺序是有规定的。在C++17中,复合赋值操作符右侧的操作数的计算及副作用保证在左侧的操作数之前完成,也就是说先进行 a *= a,将 a 赋值为144,然后再计算最左侧的 a(144)并与刚才得到的144相加得到288并赋值给 a ,最终 a = 288。


user avatar   zh-main 网友的相关建议: 
      

这跟编译器的解释规则相关,一般来说赋值从右往左。我个人觉得哈,这个问题真的没什么意义。没有人会在实际中写这种完全没有可读性的垃圾代码。




  

相关话题

  相比较 C++ 程序以 main 函数为入口,其他语言如 Java、AS3 等,程序的入口是怎样的? 
  如何在一个月内提高 C++ 水平? 
  <<深度探索c++对象模型>>中的虚继承看着蛋疼,感觉这在实际中也没多大用,需要继续深究吗? 
  如果同时有两个项目让你选择,一个是使用C++的QT,一个是用JAVA的Android,你愿意往哪个方向发展?请说出您的理由。 
  既然有文件后缀名,为何还需要MIME类型? 
  JavaScript(V8,Node) 的开发效率比 Java(JVM,Vert.x) 高在哪里? 
  如果编译器遇到未定义行为把硬盘格式化了,需要负法律责任吗? 
  为什么微软不把C# 设计成像C++一样可以编写底层3D程序的一门语言了? 
  「木兰」编程语言有什么特色? 
  for 循环为什么不支持小数? 

前一个讨论
JVM 常量池中存储的是对象还是引用呢?
下一个讨论
为什么那么多人说知乎喷子多还忍不住刷知乎?





© 2025-04-16 - tinynew.org. All Rights Reserved.
© 2025-04-16 - tinynew.org. 保留所有权利