2017-07-14 67 views
1
var a=1; 
b=++a*a; 
console.log(b); 
console.log(a); 

結果是4,2如何讓程序得到這個結果? 在我看來,結果將是2,2javascript的前綴操作會如何導致這樣的結果?

任何人都可以告訴我javascript編譯器如何編譯這段代碼並得到結果4,2。

那麼深層次的問題就是爲什麼這兩段代碼的結果是相同的。

var a=2; 
var b=3; 
c=(a++)*a; 
console.log(c); 


var a=2; 
var b=3; 
c=(a++)*b; 
console.log(c); 

任何人都可以解釋這一步一步一步?

+0

爲什麼會得到C編程language.Like錯誤此INT A = 1; B = ++ A * A;的console.log(b)中;的console.log(a)的c和javascript之間有什麼區別,爲什麼c會得到錯誤。 – JackieWillen

+0

Javascript和C之間的區別(除了明顯的語法差異之外)是Javascript總是從右到左評估而C不是; C可以以任何順序或甚至並行評估「*」的參數。因此,您不允許在同一表達式中修改和使用變量。請參閱https://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior – rici

回答

1

++具有比*更高的優先級。因此b = ++ a * a被評估爲b = (++a) * a

++a使得a等於2,然後a被自己弄糊塗了。

在旁註中,每當你被類似的東西搞糊塗時,找到JavaScript的運算符優先級表,並嘗試自己破壞方程式。

+0

爲什麼這將在C編程語言中出現錯誤。就像這個int a = 1; b = ++ a * a; console.log(b); console.log(a); – JackieWillen

+1

我不是C專家,但可能是因爲'b'沒有聲明。嘗試'int b = ++ a * a;' – Kapol

+0

我在b之前加int,但仍然得到如下錯誤: 第2行:錯誤:初始化元素不是常量 第3行:error:expected'=',',' ,';','asm'或'__attribute__'之前'。'令牌 第4行:錯誤:預期在''之前'=',',',';','asm'或'__attribute__'。令牌 – JackieWillen

0

++ a在乘法之前將值增加到2。在此之後,變量「a」將指向值2,它將進行乘法運算:2 * 2。

一個++ *一個WIL給你想要的結果(2,2)

+0

爲什麼這會在c語言中得到錯誤。就像這個int a = 1; B = ++ A * A;的console.log(b)中;的console.log(a)的c和javascript之間有什麼區別,爲什麼c會得到錯誤。 – JackieWillen