オフライン試験のQ23〜Q38のついて考察せよ。コードと実行結果を示し、各問について考察すること。
Q23
Q23.プログラム
01 02 03 04 05 06 07
|
public class Q23 {
public static void main(String[] args) {
int x,y;
x = 100; x +=1; x--; y = 200 + x;
System.out.println(y++);
}
}
|
Q23.実行結果
Q23.考察
初めに x = 100 が設定され、
x +=1 のところで x = 101 となり、
x-- で x = 100
y = 200 + x で y = 300
System.out.println(y++) は後置きインクリメントなので、出力するときはまだインクリメントされていない。
よって出力は300となる。
Q24
Q24.プログラム
01 02 03 04 05 06 07
|
public class Q24 {
public static void main(String[] args) {
int a=0, x=0;
a = 5; a +=3; x = ++a;
System.out.println(x);
}
}
|
Q24.実行結果
Q24.考察
a=5で、
a +=3 であるから aに3を加えて a=8、
x = ++a であるから aに1加えたものをxに代入して x = 9
よって xの値(9)が出力される。
Q25
Q25.プログラム
01 02 03 04 05 06 07
|
public class Q25 {
public static void main(String[] args) {
int a=9, b=3;
a /= b;
System.out.println(a %= b);
}
}
|
Q25.実行結果
Q25.考察
int a=9, b=3
a /= b で a = 3
a %= b は 3/3 した値の余りをaに代入するので、0が出力される。
Q26
Q26.プログラム
01 02 03 04 05 06 07
|
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);
}
}
|
Q26.実行結果
Q26.考察
iが3の時にループを抜ける。そのときはiもjも3である。よって、9を出力する。
また、このループ内でのインクリメント処理の順番は、++j , i++である。
Q27
Q27.プログラム
01 02 03 04 05 06
|
public class Q27 {
public static void main(String[] args) {
int i=2;
while(i-- > 0) System.out.print(i);
}
}
|
Q27.実行結果
Q27.考察
一回目のループでは i = 2 > 0 の判定の後、デクリメントされ i = 1 となり 1 が 出力される。但し改行はされない。
二回目のループでは i = 1 > 0 の判定の後、デクリメントされ i = 0 となり 0 が 出力。改行はされない。
次のループで i = 0 であるからループから抜ける。
したがって実行すると10が出力される。
Q28
Q28.プログラム
01 02 03 04 05 06 07
|
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);
}
}
|
Q28.実行結果
Q28.考察
ビット演算子での計算になっている。
ループの一回目は、i = 0 であるから 10000 >>= 0 。num = 10000
二回目は、i = 1 であるから 10000 >>= 1 。num = 5000
三回目は、i = 2 であるから 5000 >>= 2 。num = 1250
四回目は、i = 3 であるから 1250 >>= 3 。num = 156
次は i = 4 となるからループから抜ける。
よって実行すると156が表示される。
このループ内での処理の順番は num >>= i , i++ である。
Q29
Q29.プログラム
01 02 03 04 05 06 07 08 09
|
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);
}
}
|
Q29.実行結果
Q29.考察
++numとiが割り切れる時にnumをインクリメントする。
i=10のときnumは9である。処理が開始されるとインクリメントされ
num=10となる。このとき割り切れるのでnumは更にインクリメントされ11が入る。
i=11のとき条件よりfor文を抜ける。
よって、出力される値は++numなので12。
Q30
Q30.プログラム
01 02 03 04 05 06 07 08
|
public class Q30 {
public static void main(String[] args) {
int a = 9;
if(a++ != 10 | a++ == 10) a++;
System.out.println(a);
}
}
|
Q30.実行結果
Q30.考察
全て後置きインクリメントであるから、
9 != 10 → インクリメントされa=10、
10 == 10 → インクリメントされa=11となる。
また、これは真であるから、さらにインクリメントされa=12。
よって12が出力される。
Q31
Q31.プログラム
01 02 03 04 05 06 07
|
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");
}
}
|
Q31.実行結果
i==0
i==1
i==2
i==3
i==4
Hello
|
Q31.考察
後置きインクリメントであるからforが行われた後にiがインクリメントされる。よって初めは0。
また、セミコロンまでが繰り返されるので、Helloは最後の1回だけ出力される。
Q32
Q32.プログラム
01 02 03 04 05 06 07
|
public class Q32 {
public static void main(String[] args) {
int i;
for( i= 0; i < 9; i +=3){}
System.out.println(i);
}
}
|
Q32.実行結果
Q32.考察
iは3ずつ足されていき、i=9のときループを抜けて出力される。よって9。
forでくりかえす内容は何も無い。
Q33
Q33.プログラム
01 02 03 04 05 06 07 08
|
public class Q33 {
public static void main(String[] args) {
for( int i = 0; i < 8; i ++){
System.out.println(i);
i += 3;
}
}
}
|
Q33.実行結果
Q33.考察
このfor文の動作は次のようになる
まずi = 0のときに0が出力される。
そして、i += 3でi=3、i++でi=4。ここで1回目のループ終了。
2回目のループの時に4が出力。
i += 3でi=7、i++でi=8。ここで2回目のループ終了。
i=8だからループから抜ける。
Q34
Q34.プログラム
01 02 03 04 05 06 07 08 09 10 11
|
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");
}
}
|
Q34.実行結果
Q34.考察
まずfor( sayHello(); i <= 6; i += 3)のsayHello()で一回表示される。
for文はi=0,3,6で合計三回繰り返されるので三回表示され、したがって全部で4回表示される。
Q35
Q35.プログラム
01 02 03 04 05 06 07 08 09 10 11
|
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;
}
|
Q35.実行結果
Q35.考察
numはstatic変数なので値を共有する。
p1.id = 1000;
p2.id = 2000;
p1.num += p1.idはp1.num = 1000
p2.num += p2.idはp2.num = 1000 + 2000 = 3000
この3000がplayerメソッドのnumに代入されるので、Player.numは3000
Q36
Q36.プログラム
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
|
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;
}
|
Q36.実行結果
p1.num == 3000
p2.num == 3000
|
Q36.考察
numはstatic変数なので値を共有。
p1.id = 1000
p2.id = 2000
Player.num += p1.id --> Player.num = 1000
Player.num += p2.id --> Player.num = 1000 + 2000 = 3000
よってPlayer.numは3000であるから、p1.numもp2.numも3000となる。
Q37
Q37.プログラム
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
|
public class Q37 {
public static void main(String argv[]){
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;
}
|
Q37.実行結果
Q37.考察
Card c3 = c1;ではc1の値がc3の値と共有される。
つまりc1=3000となるので、
3000+2000+3000=8000となる。
Q38
Q38.プログラム
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
|
public class Q38 {
public static void main(String argv[]) {
Card c1 = new Card();
Card c2 = c1;
c1.deposit = 1000;
c2.deposit = 2000;
Bank.useCard(c1);
Bank.useCard(c2);
System.out.println(c1.deposit); /* A */
System.out.println(c2.deposit); /* A */
}
}
class Card{ int deposit; }
class Bank{
public static void useCard(Card c){
c.deposit -= 500;
}
}
|
Q38.実行結果
Q38.考察
Card c2 = c1;ではc1がc2と共有される。
よってc1の値は2000となる。
Bank.useCard(c1);ではc1が500マイナスされる。しかしc1とc2は共有されているので、それぞれマイナスされ、c1=1500,c2=1500となる。
Bank.useCard(c2);も同様な動作となりc1=1000,c2=1000となる
|