08/03/16 21:14:41
①②が何を指すのか分からないんだが。a = ① b = ② で合ってるか?
a = b
と代入した時点で、aが参照しているArrayクラスと、
bが参照しているArrayクラスが一緒になる。
もともとaが参照してたArrayクラスは、(たぶん)ガベコレでサヨウナラだ。
((a=b)[a[3]]) :
1. a = b -> b
2. b[b[3]] -> b[3] -> 3
正確に書くんだったら、「Java言語仕様」でも参照しないとムリっぽ。
俺はあんな本全部覚えられるほど頭良くねえ。
994:仕様書無しさん
08/03/16 21:15:08
>>991
代入とかくと、
System.out.println(a[(a=b)[3]]);
以下と同じということになるか、と。
a=b;
System.out.println(a[a[3]]);
これとはちがうからねえ。
一行で表現される式内の一時オブジェクトに代入ということかな、と。
#あ、最初の回答者ではないんで。
995:仕様書無しさん
08/03/16 21:18:02
>>993
このあたりの基本文法構造は、CやC++でも同じでは?
996:986
08/03/16 21:27:27
正直Javaは数年触ってないから自信ないよねっと。
class Test {
public static void main(String[] args) {
// Arrayクラスは、Java君がどっかに領域作ってくれるんじゃね
int[] a = { 11, 12, 13, 14 }; // aは、Arrayクラスの在処を覚えた
int[] b = { 0, 1, 2, 3 }; // bは、Arrayクラスの在処を覚えた
int[] c = null;
// >>991 「シャローコピー」でググって説明を探すと大吉
c = a; // aの指すArrayクラスの場所を、cに教えてやる
a = b; // bの指すArrayクラスの場所を、aに教えてやる
b[0] = 10000;
System.out.println(a[0]); // b[0]と一緒
System.out.println(b[0]);
System.out.println(c[0]); // a[0]と一緒
}
}
C:\test>javac Test.java
C:\test>java Test
10000
10000
11
997:991
08/03/16 21:41:21
>994
違いますよ~。
配列アクセスでは、ブラケット([])の式が評価される前に
ブラケット([])の前にある式が完全に評価される事が保障されています。
その評価された値は別の場所に記憶されます。
たとえば、
class Test {
public static void main(String[] args) {
int index = 1;
try {
skedaddle()[index=2]++;
} catch(Exception e) {
System.out.println(e + ", index=" + index);
}
}
static int[] skedaddle() throws Exception {
throw new Exception("Ciao");
}
}
の結果は
java.lang.Exception: Ciao, index = 1
となります。
ブラケット[]の中の式は評価されていません。
998:仕様書無しさん
08/03/16 21:43:18
何だお前ら、珍しくjavaの話してるな・・・
999:986
08/03/16 21:47:25
>>991
正確には「a = b」は
bが指しているArrayクラスの位置を、aに代入する
になる。
言い換えると「a = b」は
a[0] = b[0];
a[1] = b[1];
a[2] = b[2];
a[3] = b[3];
の代用にはならん。
後、揚げ足取られるとウザイんで、
何でもかんでも「正確じゃない」って書いてる。
1000:986
08/03/16 21:48:42
まるっこコピーが欲しいならArray#clone()だろうか。
class Test {
public static void main(String[] args) {
int[] a = { 11, 12, 13, 14 };
int[] b = { 0, 1, 2, 3 };
// 1. bと同じ内容のArrayクラスを作る
// 2. aに、1で作ったArrayクラスの場所を教えてやる
a = b.clone();
b[0] = 10000;
System.out.println(a[0]);
System.out.println(b[0]);
}
}
ハイ後は適当にヨロシク。あと次ぎスレへGO。
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。