0

test262テスト スイートには、ソースを含むテストがあります。

var x=0, y=0;
var z=
x
++
++
y

注釈には次のように書かれています。

後置インクリメント/デクリメント演算子 (I/DO) とオペランドの間の LineTerminator(LT) は許可されていないため、自動セミコロン挿入後に [LT] で区切られた 2 つの参照の間の 2 つの IO (2 つの DO とそれらの組み合わせと同様) は構文エラーにつながります。

このコードで構文エラーが発生するのはなぜですか? 有効なコードスニペットだと思います。上記のコードは と同じですvar z=x; ++ ++ y;。式++ ++ yはJavaScript 文法で許可されています。だから問題は何ですか?

4

3 に答える 3

4

このコードは次のようになります。

var z = x;
++ ++ y;

これ++ ++ yが問題の根本です。その理由を見てみましょう...

++ ++ yとして評価され++(++y)ます。最初のステップは評価(++y)です。++演算子は、隣にある変数によって参照される値をインクリメントし、インクリメントされた値を返します。ここで重要な点は、参照を返さず、値だけを返すことです。したがって、2 番目のステップは++(1), (または生成されたもの++y) になります。これは、参照のみをインクリメントできるため、エラーです。

于 2013-01-14T19:58:54.107 に答える
-1

文法では、改行を++or--演算子の前に置くことはできません。そのような改行は に変換する必要があります;。したがって、式は次のように解析する必要があります。

var x = 0 , y = 0 ;
var z = x ;
++ ;
++ y ;

3 行目は違法です。

参考文献:

7.9.1項「自動セミコロン挿入の規則」、規則3

11.3項「11.3接尾式」。

于 2013-01-14T19:57:46.267 に答える
-1

それは次のように評価されます。

var x = 0, y = 0;
var z = x ++ ++ y; //MAKES NO SENSE!
于 2013-01-14T19:17:50.310 に答える