4

C#では、

string s = "abc";
s += (s += s);
Console.WriteLine(s);

書き込みabcabcabc(http://ideone.com/pFNFX2)。C#仕様では、セクション7.16.2で次のように明示的に記述されているため、これは問題ありません。

xが1回だけ評価されることを除いて、操作はx = xopyとして評価されます。

ただし、ECMAScript 5.1言語仕様のセクション11.3.2にある複合代入演算子の説明を読んでいると、この演算子のセマンティクスにそのような「1回だけ」の修飾子がありません。代わりに、私が見るのは次のとおりです。

  1. lrefをLeftHandSideExpressionの評価結果とします。
  2. lvalをGetValue(lref)とします。
  3. rrefをAssignmentExpressionの評価結果とします。
  4. rvalをGetValue(rref)とします。
  5. rをlvalとrvalに演算子@を適用した結果とします。
  6. 次の条件がすべて当てはまる場合は、SyntaxError例外をスローします。(snipped)
  7. PutValue(lref、r)を呼び出します。
  8. rを返します。

したがって、(とにかく)次のJavaScriptコードが表示されます

var s = "abc";
s += (s += s);
alert(s);

警告abcabcabcabcしますが(括弧で囲まれた式の7行目のPutValueのため)、とにかくChrome22では警告しabcabcabcます。

だから私の質問は:私は仕様を読み間違えているのか、それともChrome(V8はおそらく?)が独自のことを仕様外で行っているのか?

4

1 に答える 1

4

したがって、操作を中断すると、次のようになります。

s += (s += s);

s = s + (s += s);
s = s + (s = s + s);    // Can't actually have the "s = " part, it's really just "s + s"
s = s + (s + s);
s = s + s + s;

つまり、結果は「abcabcabc」になるはずです。

于 2012-10-28T06:20:56.843 に答える