report4

今回の課題

試験問題の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 = 100 でxに100が入り、次の行でxに+1される。
● その次の行では、xから-1されるので、結局xには100が入っていることになる。
● 次のy = 200 + xで、200 + xをyに入れ、200 + 100 = 300となり、yには300が入る。
● 最後のSystem.out.println(y++)では、yを出力した後に1を足すので、出力されるのは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 = 5でaに5を代入。
● 次の行でaに+3する。(5+3=8でaに8が入る)
● x = ++aでaに+3したのをxに代入(8+1=9で9がxに入る)
● 最後にSystem.out.printlnで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
考察
● int型で指定して、aに9,bに3を入れる。
● a /=bでは、a/bをaに入れる。
● a %=bではaをbで割った余りを出力するので、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文に{}が付いてない時は次のセミコロン(;)までを{}内と考えるので、このfor文は3回繰り返され、
 i=3,j=3になり、出力が(i*j)となっているので、3*3=9となり、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)となっているので、出力結果は以下のようになる。
 i=2は0より大きいので、1引いて出力する。よって、1
 i=1は0より大きいので、1引いて出力する。よって、0
 i=0は0より大きくないので、終了
 以上より、出力結果は、10になる。(System.out.printlnではないので改行されない)

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
考察
● >>はシフト演算子であり、シフト演算は2進数に直して行う。
● 1000を2進数で表すと、10011100010000となる。これを右シフトさせる。
● for文より、0,1,2,3とシフトさせるので、合計6ビットシフトさせる。
● シフトさせた結果、00000010011100となるので、これを10進数に直すと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
考察
● if文は最初i=1の時は実行されるが、2回目からはnumの方が1大きいので、条件に合わず、実行されない。
● iは最後は10になるので、numは11になり、出力する際には++numで1足されるので出力結果は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
考察
● a++なので条件に当てはめた後に+1をすればいい。
● a++ != 10では、aは9(条件に当てはめた後に+1する)。a++ == 10では、aは10(条件に当てはめた後に+1する)。
● この時点でのaの値は11になっていて、最後にまたa++があるので、+1して、出力結果は12になる。

Q31

次のコードを実行した後、"Hello"は何回表示されるか述べよ。
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文に{}がない時は次のセミコロン(;)までを{}内と見なすということだったので、
 System.out.println("Hello")は{}外になる。よって、1回しか表示されない。

Q32

次のコードを実行した後の出力値を述べよ。
public class Q32{
    public static void main(String args[]){     
        int i;
        for(i = 0; i < 9;i += 3){}
       System.out.println(i)
    }
}
実行結果
9
考察
● iは+3づつされていき、iが9以上になった時に終わるので、最後には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
考察
● まず、i=0の時に出力される。
● 次にi += 3でiが3になり、その後のi++でiは4になる。ここで4が出力される。
● 同じように+3と+1していくと、i=8となり終了。

Q34

次のコードを実行した後、"Hello"は何回表示されるか述べよ。
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文のfor( sayHello(); i <= 6; i += 3)の条件の部分で1回表示。
● 次に、for文は3回繰り返されるので3回表示される。よって、合計4回表示。

Q35

次のコードを実行した後の出力値を述べよ。
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
考察
● p1には1000、p2には2000が入っている。また、numはstatic変数なので値を共有している。
● p1.num += p1.idで、num=1000となり、p2.num += p2.idで、num=1000+2000、よって3000が出力。

Q36

次のコードを実行した後の出力値を述べよ。
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変数で定義されているので共有されている。
● さっきと同じようにしいていくと、numには3000が入る。
● p1.numとp2.numが出力されるようになっているが、共有ということなので値が同じ。よって、3000。

Q37

次のコードを実行した後の出力値を述べよ。
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;
 }
実行結果
8000
考察
● Card c3 = c1とあるので、c3とc1は同じものとして考えられる。
● c1に1000入れた後にc3に3000入れているので、c1の1000が3000に置き換えられ、c1、c3とも3000が入る。
● sum=3000+2000+3000=8000となるので、出力結果は8000となる。

Q38

次のコードを実行したとき、コード中のAの時点においてc1.depositとc2.depositの関係を述べよ。
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 );
        /* 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=c2と考える。
● c1.deposit =1000でc1,c2とも1000が入る。
● c2.deposit =2000でc1,c2とも2000が入る。
● Bank.useCard( c1 )で500引かれるが、c1とc2は同じなので、次のBank.useCard( c2 )でも
 500引かれることになり、合計で1000引かれる。
● よって、Aの時点では、c1.depositに1000、c2.depositに1000となっているので、
 c1.deposit=c2.depositという関係。

感想

 試験の考察をすることでわからなかったところの動作がわかり、また、忘れていたことも思い出すことが
できたので、勉強になったと思います。
 Q38は目で見てすぐにわかるように出力させてみました。