☆課題☆

オフライン試験のQ23〜Q38のついて考察せよ。
コードと実行結果を示し、各問について考察すること。

Q23

class Test23 {

public static void main(String[] args) {
int x,y;
x = 100; x +=1; x--; y = 200 + x;
System.out.println(y++);

}
}

実行結果

300

考察

x=100
x=100+1
x=101-1
y=200+x(100)
y++は後置きのインクリメントなので出力するときにはインクリメントされない。

Q24

class Test24 {

public static void main(String[] args) {
int a=0, x=0;
a=5;  a +=3;  x = ++a;
System.out.println(x);

}
}

実行結果

9

考察

a=0,x=0
a=5
a=5+3
x=a+1
x=9

Q25

class Test25 {

public static void main(String[] args) {
int a=9, b=3;
a /= b;
System.out.println(a %= b);

}
}

実行結果

0

考察

a=9,b=3
a=9/3
3/3の余りを出力。

Q26

class Test26 {

public static void main(String[] args) {
int i, j;
for(i=0, j=0; i<3; i++) ++j;
System.out.println(i * j);

}
}

実行結果

9

考察

iが3以下のときiとjに1を足す。
i*j=3*3=9

Q27

class Test27 {

public static void main(String[] args) {
int i=2;
while(i-- > 0) System.out.print(i);

}
}

実行結果

10

考察

i=2
i(2)が-1されて1が出力。その次i(1)が-1されて0が出力。
0でwhile文から抜ける。

Q28

class Test28 {

public static void main(String[] args) {
int num=10000;
for(int i = 0; i < 4; i++) num >>= i;
System.out.println(num);

}
}

実行結果

156

考察

num=10000
i=0
iが4未満ならi+1
numを右方向にiだけシフト。注意点は2進数だと言う事。
i=1,num=5000
i=2,num=1250
i=3,num=156
i=4になるとfor文から抜ける。
num(156)が出力。

Q29

class Test29 {

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

考察

num=0
i=1、iが10以下ならばiに1を足す。num+1をiで割り切れたらnum+1。
でもiとnumは同時に増えているので、num=10+1で11になり、
さらに+1されたものが出力される。

Q30

class Test30 {

public static void main(String[] args) {
int a = 9;
if(a++ != 10 | a++ == 10) a++;
System.out.println(a);

}
}

実行結果

12

考察

9!=10よってインクリメント
10==10よってインクリメント
これが真だから12が出力。

Q31

class Test31 {

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から始まり、5未満ならiに1を足す。
i=0
i=1
i=2
i=3
i=4
Hello
が出力。

Q32

class Test32 {

public static void main(String[] args) {
int i;
for( i= 0; i < 9; i +=3){}
System.out.println(i);

}
}

実行結果

9

考察

i=0からはじまり9になるまで3を足す。
9が出力。

Q33

class Test33 {

public static void main(String[] args) {
for( int i = 0; i < 8; i ++){
System.out.println(i);
i += 3;
}
}
}

実行結果

0
4

考察

i=0,iが8未満ならiに1を足す。0が出力。
i+3されて4がfor文のなかに入り、4が出力。
+1されて+3されて8になり、for文から抜ける。

Q34

class Test34 {

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で1回、その後にiに3が入ってhelloを3回。
合計4回出力。

Q35

class Test35 {

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

考察

staticなので共有。
num=0,id=0
Player p1 = new Player();
Player p2 = new Player();
クラスPlayerをTest35のクラスで使えるようにしている。
p1.id=1000
p2.id=2000
p1の中のnumに+1000
p2の中のnumに+2000
0+1000+2000=3000

Q36

class Test36 {

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

考察

35と同じ流れ。
p1.num==とp2.num==をただ出力してnumの値を入れている。

Q37

class Test37 {

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;
}

実行結果

8000

考察

35と大体同じ部分はいいとして…
c1.deposit=1000
c2.deposit=2000
c3.deposit=3000
そしてこのときc1=c3なのでc1.deposit=3000
3000+2000+3000=8000が出力。

Q38

class Test38 {

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);
/*A*/
System.out.println(c1.deposit);
System.out.println(c2.deposit);
}
}

class Card{ int deposit; }

class Bank{
public static void useCard(Card c){
c.deposit -= 500;
}
}

実行結果

1000
1000

考察

出力部分がないので出力部分を足して実行した。

c1.deposit=1000
c2.deposit=2000
このとき、c2=c1なのでc1.deposit=2000
クラスBankに入りc1=2000-500=1500
このときc2も同じ値になる。
そしてc2も同様にBankに入り、c2.deposit=1500-500=1000
これがc1に入り同じ値になる。
そして両方1000が出力される。

感想

考えるというより作業だった。なぜこうなるのかと考えるのはよかったけどソースを書くのが長過ぎる…。
めんどくさいこと山のごとしでした。
今回は早めにやってよかった。