5

私は Codingbat.com の問題に取り組んでおり、+=演算子にとって、a += bが と必ずしも正確に等しいとは限らないという事実に出くわしましたa = a + bcharAt()これはよく知られており、以前に SO で議論されていましたが、上記の構文と組み合わせてメソッドを使用すると、理解できない奇妙なことが起こりました。

2 つの変数があるとします。

String str    = "The";
String result = "";

「str」の最初の文字を「result」に 2 回追加します。これを行う 1 つの方法は次のとおりです。

result = result + str.charAt(0) + str.charAt(0);

になりますresult = "TT"

ただし、+=演​​算子を使用すると、たとえば次のようになります。

result += str.charAt(0) + str.charAt(0);

私は得るresult = "168"。明らかに文字の追加が行われています (「T」の ASCII コードは 84、84*2 = 168)。

+=演算子を使用した最初のケ​​ースで実際に何が起こっているのか疑問に思っています。代入演算子に関するドキュメントによると、:E1 op= E2は と同等E1 = (T)((E1) op (E2))です。したがって、演算子"168"を使用した場合と同じように、後者の式が出力されることを期待します。+=しかし、次の出力"TT"は正しく、そうではありません"168":

result = (String)(result + str.charAt(0) + str.charAt(0));

ドキュメントを誤解しただけですか?SO に関する回答も見つかりました。これは、str1 += str2次と同等であることを示唆しています。

str1 = new StringBuilder().append(str1).append(str2).toString();

ただし、以下を評価します。

result = new StringBuilder().append(str.charAt(0)).append(str.charAt(0)).toString();

それでも"TT"ではなくになり"168"ます。

長文すみません!charAt()String と を組み合わせて使用​​したときに実際に何が起こっているのかに興味があり+=ます。これは、見つけた 2 つの "同等" (2 つから 3 つの用語を正しく翻訳した場合) が同じ結果を生成しないためです。

4

3 に答える 3

7
result = result + str.charAt(0) + str.charAt(0);

resultは文字列であるため、最初に+文字列連結を実行し、別の文字列を生成します。2 番目+の も同じロジックで、文字列連結を実行します。これにより、目的の結果が得られます。

result += str.charAt(0) + str.charAt(0);

右辺str.charAt(0) + str.charAt(0)が最初に評価されます。これは単純な整数の加算のように機能し、ASCII 値を加算しますint次に、この結果 (この場合は -- 84) をに追加しますresult。これが表示されます。

char c = 'T';
System.out.println(c + c);
168

ここでの根本的な違いは、物事が評価される順序です。

于 2014-07-24T15:58:31.123 に答える
2
str.charAt(0) + str.charAt(0)

+=割り当てが行われる前に全体として評価されます。

charAtchar整数のように加算が定義されているa を返します。したがって、これは次と同じです。

result = result + (str.charAt(0) + str.charAt(0));
于 2014-07-24T15:59:29.113 に答える