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;
}
為什么兩個(gè)程序打印出的a的值不同,java是-9,c++是0
光陰似箭催人老,日月如移越少年。
這個(gè)問(wèn)題和運(yùn)算符沒(méi)有關(guān)系,都是從右往左計(jì)算,而是編譯器對(duì)值類型的處理結(jié)果不一致導(dǎo)致的差異。
對(duì)于gc類語(yǔ)言來(lái)說(shuō),包括(java
,c#
,php
,javascript
)等,對(duì)于單句指令的中間運(yùn)算結(jié)果會(huì)進(jìn)行緩存。而C/C++由于直接編譯為匯編指令,沒(méi)有虛擬機(jī)或引擎的支持,所以不會(huì)有這一步。
通俗點(diǎn)來(lái)說(shuō),對(duì)于c++:
a=3*3;//9
a=a+a;//18
a=a-a;//0
也就是說(shuō)a的值是值類型,會(huì)隨時(shí)跟隨a的變化而更新。無(wú)論初始設(shè)置a的值為幾,結(jié)果都是0。(a-a).
然而對(duì)于其他語(yǔ)言,虛擬機(jī)或引擎會(huì)自動(dòng)保存每一步的計(jì)算結(jié)果。
int a=3;
int result=0;
result=a*a;//9
result=a+result;//3+9=12
result=a-result;//3-12=-9
以上。
引申:PHP 一個(gè)詭異的加法算法的研究
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)