たとえば、
a * b c; >
、最初にべき乗を計算し、次に乗算と除算、最後に加算と減算を計算します。
、括弧がある場合は、括弧内を最初に計算し、同じレベルの演算が次から順に実行されます。左から右へ
この時点でのすべてのプログラミング 言語は数学における数値の計算順序を採用します。もちろん、プログラミング言語には数学の演算子とは異なる演算子がいくつかあります。オペランドの評価順序は何ですか?
次のように
// Find a と b の合計
sum = a b;
、メモリから a の値を取得
、メモリから b の値を取得
、加算を実行操作
は非常に説明的であるように思えます 精神薄弱、もちろんそれがそれです。最初に b の値を取得し、次に a を取得してからそれらを加算すると考える人もいるかもしれません。最終的な結果は同じです。確かに。しかし、オペランドが関数実行の場合はどうなるでしょうか?
sum = a fun();
fun 関数は 1 つの数値のみを返すと仮定します。このとき、最初の a の値を取得してから fun の実行後に値を取得するかどうかは関係ありません。最終的な結果は同じです。そういえば、まだ新しいことも混乱することもありません。
しかし、fun が数値を返すだけでなく、a を変更する場合はどうなるでしょうか? たとえば、次の JavaScript コード
var a = 5;
function fun(){
a = 10;
}
var b = a fun();
fun 関数は 20 を返すだけでなく、a の値も変更します。そして、a は加算演算に参加する a です。この時、追加操作に参加するのはテイク5か10のどちらが良いでしょうか? 5 の場合、b の値は 25、10 の場合、b の値は 30 です。 JavaScript での結果は 25 です。ただし、C 言語では次のように 30 になります。
int a = 5;
int fun(){
a = 10;
}
int b = a fun(); 🎜>
したがって、関数に副作用がある場合に限り、オペランドの評価順序が異なると結果が異なります。明らかに、言語ごとに実装方法が異なります。
JavaScript 言語では、左から右に、a は 5 を受け取り、fun は実行後に 20 を返し、最後に 5 20 を返します。この操作に参加するときの a は 5 ですが、実際には a の値が変更されていることに注意してください。以下のように
コードをコピーします
var b = a fun();
alert(a); // 10
C 言語では、最初に fun が実行され、fun で a の値が 10 に変更されます。この「加算」操作では、 fun は 20 を返します。結果は 10 20 です。
JavaScript か C かがわかります。 a の値は最終的に 10 に変更されました。違いは、加算演算に参加する場合、JavaScript は変更されていない値 5 を取得し、C は変更された値 10 を取得することです。
C言語でも演算は左から右です。ただし、オペランドとして関数がある場合は、その関数が最初に実行されます。変更された関数に副作用がある場合は、変更された値がこの操作に参加するために使用されます。楽しいの順番は関係ありません。次のように fun を前に置きます。C 言語では結果は 30 のままです。
コードをコピーします
コードは次のとおりです:
JavaScript で fun と a の順序を入れ替えると、結果は 25 になりません。
コードをコピーします
コードは次のとおりです。
>
関数の副作用