首页 > 开发 > C++ > 正文

运算顺序问题

2017-09-11 21:28:45  来源: 网友分享

java代码

import javax.swing.*;public class test12{    public static void main(String[] args)    {        int a = 3;        a -= a += a * a;        System.out.println(a)    }}c++代码#include <iostream>using namespace std;int main(){    int a = 3;    a -= a += a * a;    cout << a << endl;    return 0;}为什么两个程序打印出的a的值不同,java是-9,c++是0

解决方案

这个问题和运算符没有关系,都是从右往左计算,而是编译器对值类型的处理结果不一致导致的差异。
对于gc类语言来说,包括(java,c#,php,javascript)等,对于单句指令的中间运算结果会进行缓存。而C/C++由于直接编译为汇编指令,没有虚拟机或引擎的支持,所以不会有这一步。
通俗点来说,对于c++:

a=3*3;//9a=a+a;//18a=a-a;//0

也就是说a的值是值类型,会随时跟随a的变化而更新。无论初始设置a的值为几,结果都是0。(a-a).
然而对于其他语言,虚拟机或引擎会自动保存每一步的计算结果。

int a=3;int result=0;result=a*a;//9result=a+result;//3+9=12result=a-result;//3-12=-9

以上。
引申:PHP 一个诡异的加法算法的研究