課題:Q23〜Q38のついて考察せよ。


Q23

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となる。

Q24

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となる。

Q25

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となる。

Q26

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となる。

Q27

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となり条件に当てはまらない為実行されない。

Q28

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となる。

Q29

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。

Q30

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となる。

Q31

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は一回だけ出力される。

Q32

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となる。

Q33

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となる。

Q34

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回出力されることになる。

Q35

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

解説 class Playerでnumはstatic変数なのでその値はそのまま保持される。すなわちp1.num+=p1.id;でnum==1000が入りp2.num+=p2.id;で1000+2000でnum==3000となる。よって実行結果は3000となる。

Q36

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には同じ値が保持されている。

Q37

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となる。

Q38

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となり等しい。

感想・反省

テストは、かなり難しかった。だから今回のレポートも大変だった(泣)