パズル22-パズル26
パズル22:URLの愚弄
http:語句の記号として使われるからです。
パズル23:働かずに得る
最初の問題は:
nd.nextInt(2)は0、1の数字しか返ってこないので、上はcase 1:の分岐文しか出ないです。case 2:理屈では永遠に動かないはずです。
二つ目の問題は、case文がbreakで終わらないと、ずっと運行に向かっています。つまりbreakのcase文が終わるまで、上の文は毎回default分岐文を実行します。
第三の問題は、StringBufferの構造関数には2つの受け入れ可能なパラメータがあり、
一つはStringBufferで、もう一つはStringBufferで、上はString Bufferのコンストラクタを使っています。実質的に実行する時に文字型をint型に変換して、このようにシュリングバッファerの初期容量として、文字自体ではありません。
いつでも、できるだけ慣れた使い方とAPIを使います。慣れないAPIを使わなければならないならないなら、その文書をよく読んでください。
パズル24:各バイトを心ゆくまで楽しむ
次のプログラムはbyteの値を巡回して、特定の値を検索します。このプログラムは何を印刷しますか?
0 x 90はint型の定数で、byte値の範囲を超えています。
(byte)0 x 90==0 x 90)結果はfalseです。比較のために、Javaは、原生タイプの変換を広げることにより、byteをintに引き上げ、2つのintを比較する。(byte)0 x 90は-112に、0 x 90は144である。
つまり、混合タイプの比較は避けたいです。内在的に混乱を起こしやすいからです。
パズル25:非情な増分動作
Dubleを使ってもいいです。floatのNaNもStringタイプを使ってもいいです。驚かないでください。String i="a"
public class Main22 {
public static void main(String[] args) {
System.out.print("iexplore:");
http://www.google.com;
System.out.println(":maximize");
}
}
実行結果:iexplore:maximizehttp:語句の記号として使われるからです。
パズル23:働かずに得る
import java.util.Random;
public class Main23 {
private static Random rnd = new Random();
public static void main(String[] args) {
StringBuffer word = null;
switch(rnd.nextInt(2)){
case 1:word = new StringBuffer('P');
case 2:word = new StringBuffer('G');
default:word = new StringBuffer('M');
}
word.append('a');
word.append('i');
word.append('n');
System.out.println(word);
}
}
上のプログラムの目的は確率を待ってPain、Gain、Mainの3つの単語を印刷しますが、何度もプログラムを実行しても永遠にainだけを印刷することが分かります。なぜですか?最初の問題は:
nd.nextInt(2)は0、1の数字しか返ってこないので、上はcase 1:の分岐文しか出ないです。case 2:理屈では永遠に動かないはずです。
二つ目の問題は、case文がbreakで終わらないと、ずっと運行に向かっています。つまりbreakのcase文が終わるまで、上の文は毎回default分岐文を実行します。
第三の問題は、StringBufferの構造関数には2つの受け入れ可能なパラメータがあり、
一つはStringBufferで、もう一つはStringBufferで、上はString Bufferのコンストラクタを使っています。実質的に実行する時に文字型をint型に変換して、このようにシュリングバッファerの初期容量として、文字自体ではありません。
いつでも、できるだけ慣れた使い方とAPIを使います。慣れないAPIを使わなければならないならないなら、その文書をよく読んでください。
パズル24:各バイトを心ゆくまで楽しむ
次のプログラムはbyteの値を巡回して、特定の値を検索します。このプログラムは何を印刷しますか?
public class Main24 {
public static void main(String[] args) {
for(byte b = Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++){
if(b==0x90){
System.out.print("Joy!");
}
}
}
}
プログラムを実行します。結果は何も印刷されません。0 x 90はint型の定数で、byte値の範囲を超えています。
(byte)0 x 90==0 x 90)結果はfalseです。比較のために、Javaは、原生タイプの変換を広げることにより、byteをintに引き上げ、2つのintを比較する。(byte)0 x 90は-112に、0 x 90は144である。
つまり、混合タイプの比較は避けたいです。内在的に混乱を起こしやすいからです。
パズル25:非情な増分動作
public class Main25 {
public static void main(String[] args) {
int j =0 ;
for(int i=0;i<10;i++){
j=j++;
}
System.out.println(j); //0
}
}
パズル26:ループ中public class Main26 {
public static final int END =Integer.MAX_VALUE;
public static final int START = END-100;
public static void main(String[] args) {
int count =0;
for(int i = START;i<=END;i++){ // , int , , int
count++;
}}}
すべてのint変数がInteger.MAX_以下であるか?VALEのです。また、インクリメンタル操作を行うと、折り返します。Integer.MIN_VALUE.
int start = Integer.MAX_VALUE-1;
for(int i =start;i<=start+1;i++); //
double i= Double.POSITIVE_INFINITY; // i
// double i = 1e56;
while(i==i+1){ //
}
double j = 0.0/0.0; //Double.NaN,float NaN
System.out.println(j-j==0); //false , NaN, NaN
while(j!=j){ //
}
while(i!=i+0){}
iの定義を与えると、上には死のサイクルがあり、Dubleを使ってもいいです。floatのNaNもStringタイプを使ってもいいです。驚かないでください。String i="a"