Sun認定Java資格 実用情報 4 【SJC-P用】at PROG
Sun認定Java資格 実用情報 4 【SJC-P用】 - 暇つぶし2ch981:仕様書無しさん
08/03/15 22:53:23
不毛だ不毛すぎるぜ 次スレでは上みたいなのはスルーな

982:972
08/03/15 23:02:41
>>978
げ、本当だ…。
やばい、また腹が立ってきた…

983:仕様書無しさん
08/03/15 23:10:14
>982
すまん。黙っておけばよかった。

984:仕様書無しさん
08/03/15 23:59:10
それもアレだがな

985:仕様書無しさん
08/03/16 19:04:36
誰か教えてください。
(再来週には、SJC-Pを受けようと思っています)
Java言語仕様で、
class Test {
 public static void main(String[] args) {
  int[] a = { 11, 12, 13, 14 };
  int[] b = { 0, 1, 2, 3 } ;
  System.out.println(a[(a=b)[3]]);
 }
}
の結果が14になります。
しかし、
class Test {
 public static void main(String[] args) {
  int[] a = { 11, 12, 13, 14 };
  int[] b = { 0, 1, 2, 3 } ;
  System.out.println(a[(a)[3]]);
 }
}
の結果は、ArrayIndexOutOfBoundsになります。
なぜでしょうか?


986:仕様書無しさん
08/03/16 20:14:02
>>985
うーん、これに何の意味があるのかサッパリわからん。
こういうのがあるから資格なんぞ寝言だと思うんだが……まあいいや。

前者:
 a=b //aにbを代入(正確じゃないが、資格レベルならそれでいいかな)
 (a=b)[3] -> b[3] -> 3
 a[(a=b)[3]] -> a[b[3]] -> a[3] -> 14 
 
後者:
 (a)[3] -> a[3] -> 14
 a[(a)[3]] -> a[14] -> インデックス超過

処理の優先順に合わせて、一個一個値を代入してみな。

987:仕様書無しさん
08/03/16 20:20:36
>>986
基本的な配列の考え方だろ。
意味が無いなんてとんでもないぜ。

988:986
08/03/16 20:43:04
>>987
単なる言葉遊びに見えちまうんだよ……。
実際の現場ではこんな書き方せんだろ?

まあアレだ、資格全然持ってない奴のヒガみ、とでも。

989:仕様書無しさん
08/03/16 20:51:10
>986
なるほど、ありがとうございます。
理解出来ました。

990:仕様書無しさん
08/03/16 20:58:25
System.out.println(a[(a=b)[3]]);
①②

これって①、②の両方ともbにおきかわるってわけではないんだね?

ではこれはどうかな?
System.out.println((a=b)[a[3]]);

991:仕様書無しさん
08/03/16 21:05:45
>989
正確ではないとは、どういう事でしょうか?
単に、ブラケット中([])の式の評価に先だってブラケットの左側にある式が完全に評価されているのだから
(aにbが入ってもこの式には影響しないから)
代入という言い方が正確ではないのでしょうか?
ご指導お願いします。
Java言語仕様を読んで勉強をしているので正確な理解がしたいのです。

992:991
08/03/16 21:14:01
>990
3だよ。

993:仕様書無しさん
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch