void Q23(){ int x,y; x = 100; x += 1; x--; y = 200 + x; System.out.println(y++); } |
Q23 300 |
x = 100; x += 1; x--; y = 200 + x;
まず、xに100を入れ、x+1、x-1、よって、xは、100のまま。
yには、200+x = 200+100 = 300を入れる。
System.out.println(y++);で、yを表示するが、
このときのy++は、yを表示するので、インクリメントしないで、
そのまま、300が表示される。
++yだと、インクリメントした後に表示するので、301になる。
void Q24(){ int a=0, x=0; a = 5; a += 3; x = ++a; System.out.println(x); } |
Q24 9 |
a = 5; a += 3; x = ++a;
aに5を入れ、a+3をする。
xには、a+1を入れる。
よって、表示結果は9
void Q25(){ int a=9, b=3; a /= b; System.out.println(a %= b); } |
Q25 0 |
a /= b; aをbで割り、aに入れる。よって、この時点では、a = 3 System.out.println(a %= b); a %= bなので、これを実行後に、aが表示される。 3を3で割ってその余りをaに入れる。 よって、表示されるのは0
void Q26(){ int i,j; for(i=0, j=0; i<3; i++) ++j; System.out.println(i * j); } |
Q26 9 |
for(i=0, j=0; i<3; i++) ++j; iが3になるまでjとiをインクリメントする。 System.out.println(i * j); 表示するのは、i*j なので、3*3で表示されるのは9
void Q27(){ int i=2; while(i-- > 0) System.out.println(i); } |
Q27 1 0 |
while(i-- > 0) System.out.println(i);
i が0になるまでiを表示するように設定してある。
i は、前の行で2に設定されているので、
まず、i から 1 を引いて、iを表示する。
2 - 1 = 1
続いて、まだ0 ではないので、繰り返す。
1 - 1 = 0
より、表示結果は、1 (改行) 0となる。
0になったのでループから吐き出されてQ27が終了。
void Q28(){ int num=10000; for(int i=0; i<4; i++) num >>= i; System.out.println(num); } |
Q28 156 |
for(int i=0; i<4; i++) num >>= i;
i が 3 になるまで i をインクリメントしつつ、numを i 回だけ右シフトする。
よって、結果的にnumを(0+1+2+3より)合計6回右シフトする。
numは、1000なので、1000/2の6乗で表示されるのは156
void Q29(){ int num=0; for(int i=1; i<=10; i++){ if(++num % i ==0) num++; } System.out.println(++num); } |
Q29 12 |
for(int i=1; i<=10; i++){
if(++num % i ==0) num++;
}
System.out.println(++num);
i が10になるまでiをインクリメントし、for文内を繰り返す。
for文内ではもし、numに1を足して i で割り、
その余りが0の場合numに1を足す。
よって、以下のことが行われている。
1+num=1(1÷1より、余りが0なのでnum+1 = 2)
1+num=3(3÷2より、余りが1なのでそのまま)
1+num=4(4÷3より、余りが1なのでそのまま)
1+num=5(5÷4より、余りが1なのでそのまま)
1+num=6(6÷5より、余りが1なのでそのまま)
1+num=7(7÷6より、余りが1なのでそのまま)
1+num=8(8÷7より、余りが1なのでそのまま)
1+num=9(9÷8より、余りが1なのでそのまま)
1+num=10(10÷9より、余りが1なのでそのまま)
1+num=11(11÷10より、余りが1なのでそのまま)
ここで、for文から出る。
出力される時に、numに1を足すので出力結果は12
void Q30(){ int a=9; if(a++ !=10 | a++ == 10) a++; System.out.println(a); } |
Q30 12 |
int a=9;
if(a++ !=10 | a++ == 10) a++;
まず、aは、9となっている。
aは9なので、a++!=!0は、成り立ち、aはインクリメントされる
aがインクリメントされ、a=10となり、
そのとなりのa++==10は真となり、aは又インクリメントする
よって、a=11となる。
両方とも真だったので、if文の内容が実行され、(a+1=a)
a=12となり、表示結果は12
void Q31(){ for(int i=0; i<5; i++) System.out.println("i == " + i); System.out.println("Hello"); } |
Q31 i == 0 i == 1 i == 2 i == 3 i == 4 Hello |
for(int i=0; i<5; i++) System.out.println("i == " + i); System.out.println("Hello"); Iが4になるまでfor文の内容、 System.out.println("i == " + i);を繰り返す。 表示した後にiはインクリメントされるので、 i == 0 i == 1 i == 2 i == 3 i == 4 となり、そのあとに、Helloを表示する。
void Q32(){ int i; for(i=0; i<9; i+=3){} System.out.println(i); } |
Q32 9 |
for(i=0; i<9; i+=3){}
iが9以上になるとfor文から抜ける。
今回は、for文内は空なので、iを3ずつインクリメントするだけ。
よって、for文を抜けるとき、iは9になり、表示結果は9
void Q33(){ for(int i=0; i<8; i++){ System.out.println(i); i+=3; } |
Q33 0 4 |
for(int i=0; i<8; i++)
iが7になるまでfor文を繰り返す。
繰り返す度に1ずつインンクリメント。
for文内では、iを出力し、その後に3インクリメントする。
よって、もう一度for文を繰り返すときは合計で4インクリメントされている。
つまり、最初は0で初期化されているので
0がまず出力される。
続いて、4インクリメントされたので
4が出力され、そのあと、4インクリメントされるが
8以上なのでここでfor文を出て終了。
public class q34 { public static void main(String[] args) { int i = 0; for(sayHello(); i <= 6; i += 3) { sayHello(); } } static void sayHello() { System.out.println("Hello"); } } |
Hello Hello Hello Hello |
for(sayHello(); i <= 6; i += 3)
iは初期値で0に設定されており、3ずつインクリメントするので
0 3 6 9と増えて行く(9でループから出る)
よって、4回sayHello()を繰り返す。
sayHelloはmainの下のほうから呼び出されている
sayHelloはHelloを出力するメゾット。
public class q35 { public static void main(String[] args) { Player p1 = new Player(); Player p2 = new Player(); p1.id = 1000; p2.id = 2000; p1.num += p1.id; p2.num += p2.id; System.out.println(Player.num); } } class Player { int id = 0; static int num = 0; } |
3000 |
Playerクラス中の変数を使うためにp1とp2というオブジェクト変数を宣言。 p1の変数idに1000を、p2の変数のidに2000を代入している。 それぞれのidは違うメモリなので両方とも値を保持する。 p1のnumにはp1のidを、p2のnumにはp2を加算していれる。 numはstaticがついているので値を共有する。 つまり、p1.numとp2.numには両方とも同じ値が入る。 p1.idの値とp2.idの値がnumに足されているので 合計2000で、表示結果は3000となる。
public class q36 { public static void main(String[] args) { Player p1 = new Player(); Player p2 = new Player(); p1.id = 1000; p2.id = 2000; Player.num += p1.id; Player.num += p2.id; System.out.println("p1.num = " + p1.num); System.out.println("p2.num = " + p2.num); } } class Player { int id = 0; static int num = 0; } |
p1.num = 3000 p2.num = 3000 |
Q36とほぼ同様の操作が行われている。 System.out.println("p1.num = " + p1.num); System.out.println("p2.num = " + p2.num); numは共有されているのでp1.numもp2.numも同じ値。 よって表示結果は p1.num = 3000 p2.num = 3000 となる。
public class q37 { public static void main(String[] args) { Card c1 = new Card(); Card c2 = new Card(); Card c3 = c1; c1.deposit = 1000; c2.deposit = 2000; c3.deposit = 3000; int sum = c1.deposit + c2.deposit + c3.deposit; System.out.println(sum); } } class Card { int deposit; } |
8000 |
まず、new Card()を用いて、Cardクラスのオブジェクトを2つ作る。 Card c3は、c1とイコールになっているので同じ値を指していることが分かる。 つづいて、それぞれに1000、2000、3000とそれぞれ値をいれる。 ただし、このとき、c1とc2は同じ値を入れているので 後で入れた3000の方が結果的には入ることになる。 sumはc1、c2、c3をそれぞれ足した結果。 c1 = 3000、c2 = 2000、c3 = 3000なので、 合計8000になり、sumにいれられる。 最後にsumを表示しているので8000が表示結果となる。
public class q38 { public static void main(String[] args) { Card c1 = new Card(); Card c2 = c1; c1.deposit = 1000; c2.deposit = 2000; Bank.useCard(c1); Bank.useCard(c2); /* A */ System.out.println("c1.deposit == " + c1.deposit); System.out.println("c2.deposit == " + c2.deposit); } } class Card { int deposit; } class Bank { public static void useCard(Card c) { c.deposit -= 500; } } |
c1.deposit == 1000 c2.deposit == 1000 |
まず、new Card()でCardクラスのオブジェクトを1つ作る。 c2はQ37の時と同様c1とイコールでおなじところを指している。 続いて、c1、c2にそれぞれ1000、2000を入れるが、 c1とc2はイコールなので後で入れたc2の方が格納される。 続いてuseCardを使う。 7行目のBank.useCard(c1);では、 2000 - 500 = 1500で、1500がmainに帰ってくる。 続いて8行目のBank.useCard(c2);では、 (c1=c2なので7行目より)1500 - 500 = 1000で 1000がメインに戻る。 よって、c1=c2=1000になる。 System.out.println("c1.deposit == " + c1.deposit); System.out.println("c2.deposit == " + c2.deposit); で、表示される結果は c1.deposit == 1000 c2.deposit == 1000です。
問題数多かったです。 テストではけっこう間違えた気がします。 Q35~38は興味深い問題でした。 staticがつくと共有するのをようやく理解しました;