国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript 運算數的求值順序

2019-11-20 23:42:35
字體:
來源:轉載
供稿:網友
比如
復制代碼 代碼如下:

a * b + c;

,先算乘方,再算乘除,最后算加減
,有括號,先算括號里面的,同一級運算按照從左到右的順序依次進行
這一點所有的程序設計語言都采取數學中數字的計算順序。當然程序設計語言中還有一些不同于數學中的運算符。那運算數的求值順序是如何的呢?
如下
復制代碼 代碼如下:

// 求 a 和 b的和
sum = a + b;

,從內存中取a的值
,從內存中取b的值
,進行相加運算
貌似描述的很弱智,理所當然就是這樣的。有人可能覺得先取b的值,再取a,然后相加。這樣最后的結果也是一樣的。的確是這樣。但如果運算數是一個函數執行呢?
sum = a + fun();
假設fun函數中僅return 一個數字。這時無論是先取a的值,再去fun執行后的值也是無所謂的。最終的結果都一樣。說到這里,仍然沒有新鮮,糾結的地方。
但如果fun不僅返回了數字,還改變了a呢? 比如以下JavaScript代碼
復制代碼 代碼如下:

var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?

fun 函數不僅返回了20,還改變了a的值。而a 正是參與相加運算的a。這時a取 5 還是 10 參與相加運算呢? 如果是5則b的值為25,如果是10,則b為30。JavaScript語言中結果是25。但C語言中卻是30,如下
復制代碼 代碼如下:

int a = 5;
int fun(){
a = 10;
return 20;
}
int b = a + fun(); // 30

因此,只有當函數有副作用的時候,運算數的求值順序不同會導致結果不同。很明顯,各個語言實現不同。
JavaScript語言中,從左到右,a取5,fun執行后返回20,最后是 5+20。注意,雖然參與此次運算時a取5,但a值實際上已經改變了。如下
復制代碼 代碼如下:

var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
alert(a); // 10

C語言中,先執行fun,fun中改變了a的值,為10,取a為10參與本次 “加”運算,fun返回20。結果是 10+20。
可以看到,無論是JavaScript還是C。a的值最后都改變了,為10。區別在于:參與相加運算時,JavaScript 取未被改變的值5, C取改變了的值10。
C語言中,運算也是從左到右的。但當有函數作為運算數時,會先執行函數。而改函數如果有副作用時,取被改變后的a值參與本次運算。無論fun和a的順序。如下將fun放在前面,在C語言中結果仍然是30
復制代碼 代碼如下:

int a = 5;
int fun(){
a = 10;
return 20;
}
int b = fun() + a; // 30

JavaScript中如果fun與a交換了順序,則結果不是25了。
復制代碼 代碼如下:

var a = 5;
function fun(){
a = 10;
return 20;
}
var b = fun() + a; // b為30

相關:
函數的副作用
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 恭城| 射洪县| 鹤山市| 黑山县| 文山县| 乐至县| 宿州市| 达孜县| 柳州市| 镇远县| 宝鸡市| 威宁| 冀州市| 扎鲁特旗| 连平县| 郴州市| 舞钢市| 四子王旗| 弥勒县| 南城县| 海门市| 伊通| 南靖县| 商南县| 双鸭山市| 民权县| 墨脱县| 商洛市| 宜君县| 崇左市| 达孜县| 双峰县| 恩平市| 调兵山市| 多伦县| 汶川县| 望谟县| 桐梓县| 隆德县| 称多县| 成安县|