JAvascript演算数の評価順序
2130 ワード
たとえば
を選択します.
、かっこがあります.まずかっこの中のものを計算します.同じレベルの演算は左から右の順に行います.
この点,すべてのプログラム設計言語は数学における数字の計算順序をとる.もちろん、プログラミング言語には数学とは異なる演算子もあります.では、演算数の評価順序はどうなっているのでしょうか.
次のように
、メモリからaの値をとる
、メモリからbの値をとる
、加算演算を行う
知的障害を描いているようで、当然そうです.bの値を取ってからaを取って加算すると思う人もいるかもしれません.これで最後の結果も同じです.確かにそうです.しかし、演算数が関数で実行されている場合は?
sum = a + fun();
fun関数にreturnの数値が1つしかないと仮定します.この場合,aの値を先に取ってfun実行後の値を行っても構わない.最終的な結果は同じです.ここまで言うと、まだ新鮮で、葛藤するところはありません.
しかしfunが数字を返すだけでなく、aを変えたとしたら?例えば以下のJavaScriptコード
fun関数は20を返すだけでなく,aの値も変えた.aは加算演算に関与するaである.このときaは5をとるのか、それとも10を取るのか.5であればbの値は25、10であればbは30である.JavaScript言語の結果は25です.しかし、C言語では30語で、以下のようになっています.
したがって,関数に副作用がある場合のみ,演算数の求め順が異なると結果が異なる.明らかに、各言語の実現は異なる.
JavaScript言語では,左から右へaを5,funを実行すると20,最後は5+20となる.なお,今回の演算に参加するとaは5をとるが,a値は実際には変化している.次のように
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です.
JavaScriptでfunとaが順番を交換した場合、結果は25ではありません.
関連:
関数の副作用
a * b + c;
を選択します.
、かっこがあります.まずかっこの中のものを計算します.同じレベルの演算は左から右の順に行います.
この点,すべてのプログラム設計言語は数学における数字の計算順序をとる.もちろん、プログラミング言語には数学とは異なる演算子もあります.では、演算数の評価順序はどうなっているのでしょうか.
次のように
// a b
sum = a + b;
、メモリからaの値をとる
、メモリからbの値をとる
、加算演算を行う
知的障害を描いているようで、当然そうです.bの値を取ってからaを取って加算すると思う人もいるかもしれません.これで最後の結果も同じです.確かにそうです.しかし、演算数が関数で実行されている場合は?
sum = a + fun();
fun関数にreturnの数値が1つしかないと仮定します.この場合,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
関連:
関数の副作用