Report#6

Q25へ
Q30へ
Q35へ
考察へ


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

考察
System.out.println(y++);
インクリメント演算子が変数の後ろについている
ので、プリントが実行された後にy+1される。

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
考察
x=++a;
インクリメント演算子が変数の前についている
ので、a+1された後にxに代入される。

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となるので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になったらループから抜けるので、
i=0 の時 j=1
i=1 の時 j=2
i=2 の時 j=3
i=3 for文を抜ける
となる。3*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) System.out.print(i);
式が評価された後にi-1される。
while(2 > 0)で評価された後i-1され、プリントされるのは1
while(1 > 0)で評価された後i-1され、プリントされるのは0になる。
printなので改行はされず、10と出力される。

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

考察
for(int i=0; i<4 ; i++) num>>=i;
iの分だけnumの値を右にシフトする
i=0 の時 num=10000
i=1 の時 num=5000
i=2 の時 num=1250
i=3 の時 num=156
i=4 for文を抜ける
となる。

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(int i=1;i<=10;i++){
if(++num%i==0) num++;}
+1されたnumがiの倍数のときにnum++されるので
最初の1回だけ実行される。
System.out.println(++num);
numに+1した後に出力される

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!=10の後にa+1されてa=10になる。
| はどちらかが真であればいい
a++なので10==10の後にa+1されて11になる。
よってif文が実行され、a=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("i== "+i);
の部分だけ、よって
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

考察
for(i=0;i<9;i+=3){}
iが9未満の場合にfor文が実行されるので、
iが9になった時点でfor文から抜ける

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(int i=0;i<8;i++){
System.out.println(i);
i+=3;}
iの値の変化は次のようなものになる
i=0 i=0
System.out.println( i ); i=0
i+=3 i=3
for(...;i++) i=4
i<8 i=4
System.out.println( 4 ); i=4
i+=3 i=7
for(...;i++) i=8
i<8 for文を抜ける


Q34


次のコードを実行した後、”Hello”は何回表示されるか述べよ。
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();i<=6;i+=3){
sayHello();}
for(sayHello();.....)のsayHello();は初期化の部分なので最初の1回だけ実行される
for文の中のsayHello();実行されるのはiが6以下の時なので
i=0
i=3
i=6
の3回実行。
よって、3+1で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

考察
static int num=0;
staticで宣言されているので値が共有されて保持される。


Q36


次のコードを実行した後の出力値を述べよ。
public class q36 {
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("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

考察
static int num=0;
staticで宣言されているので値が共有されて保持される。


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にも3000がはいる。


Q38


次のコードを実行したとき、コード中のAの時点においてc1.depositとc2.depositの関係を述べよ。
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 */
}
}

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

答え
c1.deposit==c2.deposit


考察
Card c2= c1;
値が共有されているのでc1.deposit==c2.depositとなる。
Bank.useCardが実行されるたびにdepositから500引かれるので
Aの時点でのdepositの値は1000になる。


考察



                                                             トップへ
○インクリメント(++)、デクリメント(--)演算子
変数の値を1増やす(減らす)働きをする演算子
式を評価する時に、変数の前に置くか、後ろに置くかで値がかわってくる

例 x=1の時

total =10*x++
とするとtotal=10
total =10*++x
とするとtotal=20になる。
どちらの場合もx=2になる

○ビットシフト演算子
>> 符号拡張子を付けて右にシフトする
>>> 0を充填して右にシフトする
<< 0を充填して左にシフトする

例 16 >> 2の時
16は2進数で 0001 0000
これを右に2シフトすると 0000 0100 で、4になる。
>>>は最左端のビット(符号)にも0を埋める。