public class q23 { public static void main(String[] args){ int x,y; x= 100; x +=1; x--; y = 200 + x; System.out.println(y++); } } |
300
x+=1;でx=101,x--;でx=100になるのでy=200+x;でy=300となる。そしてy++は後ろ置きのインクリメントなので300と出力された後に実行される。よって実行結果は300となる。
public class q24 { public static void main(String[] args){ int a = 0, x = 0; a = 5; a +=3; x = ++a; System.out.println(x); } } |
9
a +=3でa=a+3という意味だからa=8となる。x= ++a;で++aは前置きのインクリメントだからa=a+1;された後にxに代入される。よってx=9となる。
public class q25 { public static void main(String[] args){ int a = 9, b = 3; a /= b; System.out.println(a %= b); } } |
0
a /=b;はa=a/b;という意味なのでa=3となる。次にa%=bはa=a%bの意味になので3/3の余りがaに入る。よって実行結果は0となる。
public class q26 { public static void main(String[] args){ int i, j; for (i=0,j=0; i<3; i++) ++j; System.out.println(i * j); } } |
9
for(i=0,j=0;i<3;i++)++j;はi<3の場合++j;を実行する繰り返しの命令である。iのインクリメントは++j;が実行された後に実行されるためSystem.out.println(i * j);を実行するときには、i=3,j=3となるため実行結果は9となる。
public class q27 { public static void main(String[] args){ int i=2; while(i-- > 0) System.out.print(i); } } |
10
while(i-->0)の時2>0で条件に当てはまる。その後iがデクリメントされるため最初に1が出力される。次に1>0となる。これも条件に当てはまるのでiがデクリメントされてから出力されので0が出力される。次の実行のとき0>0となり条件に当てはまらない為実行されない。
public class q28 { public static void main(String[] args){ int num = 10000; for (int i = 0; i < 4; i++) num >>= i; System.out.println(num); } } |
156
num >>= i;はnum=num>>i;と同じ意味なのでfor文を繰り返すと結局num>>6という意味になる。num=10000;なので2進数で表すと10011100010000となる。これを右に6桁ずらすので10011100となり10進数で156となるため実行結果は156となる。
public class q29 { public static void main(String[] args){ int num = 0; for (int i = 1; i<= 10; i++) { if(++num % i ==0) num++; } System.out.println(++num); } } |
12
for文でiが1から10まで繰り返し++num%i==0;はnumをインクリメントした後numをiで割った余りが0かどうかという意味である。もしそうならnum++;を実行する。
iが10までは実行されるためfor文を抜けた後はnum=11となる。その後出力するときに++numで前置きのインクリメントがあるためnum=num+1;されてから出力されるよってnum=12となり実行結果は12。
public class q30 { public static void main(String[] args){ int a = 9; if(a++ != 10 | a++ == 10) a++; System.out.println(a); } } |
12
if文でa++!=10かa++ ==10ならばa++すると意味。まずa==9なのでa++!=10の条件に当てはまる。a++!=10なのでこの条件が調べられた後aはインクリメントされa==10となる。次のa++==10でこの条件が調べられた後もaはインクリメントされa==11となる。最初の条件と後の条件も当てはまっているのでif文の後のa++が実行されてa==12となる。
public class q31 { public static void main(String[] args){ for(int i = 0; i < 5; i++) System.out.println("i == " + i); System.out.println("Hello"); } } |
i == 0 i == 1 i == 2 i == 3 i == 4 Hello
for文でi=0からi<5のときまでSystem.out.printlnを繰り返すのでi==5になったとき条件からはずれるので出力されるのはi==4のときまで、その後にHelloが出力される。よってHelloは一回だけ出力される。
public class q32 { public static void main(String[] args){ int i; for( i = 0; i < 9; i +=3){} System.out.println(i); } } |
9
for文でi<9の条件を満たす限り繰り返す。i+=3はi=i+3の意味なのでfor分を三回繰り返したときi==9となり実行結果は9となる。
public class q33 { public static void main(String[] args){ for( int i = 0; i < 8; i ++ ){ System.out.println(i); i +=3; } } } |
0 4
for文でi<8の条件からはずれるまでSystem.out.printlnを繰り返す。
最初、i==0なので0が出力される。その後i+=3なのでi=i+3の処理をやりi==3となる。
次のループにいくまえにiがインクリメントされるためi==4となり4が出力される。
i+=3でi==7となる。iがインクリメントされてfor文の条件からはずれる。よって実行結果は04となる。
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();...のsayHello()でsayHelloメソッドにとぶ。i<=6に条件を満たすときsayHello();を実行するとうい事だから、i==0で2回目のsayHello();を実行する。i+=3でi==3になり次のループにうつり3回目のsayHello();を実行,またi+=3でi==6となり4回目のsayHello()を実行、その後i==9となるため条件から外れる。よってHelloは4回出力されることになる。
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
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
上の問題と同様でnumはstatic変数なのでそのまま保持される。よってp1.numとp2.numには同じ値が保持されている。
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
Card c3 = c1;だからc3.deposit = 3000;が代入された時点でc1.deposit = 3000が代入される。よってc1.deposit + c2.deposit + c3.deposit;は3000+2000+3000となるので実行結果は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
Card c2 = c1;なのでc1.deposit = 1000;が代入されてもその後にc2.deposit = 2000;が代入されるためc1.deposit=2000となる。Bankメソッドにとびc1.depositから500引いてc1.depositは1500になる。そのためc2.deposit==1500になる。次のBankメソッドでc2.deposit==1000になるためc1.deposit==1000になる。よってc1.depositeとc2.depositeの値は/* A */の時点で1000となり等しい。