パズル22-パズル26


パズル22:URLの愚弄
public class Main22 {
	
	public static void main(String[] args) {

		System.out.print("iexplore:");
		http://www.google.com;
		System.out.println(":maximize");
	}
}
実行結果:iexplore:maximize
http:語句の記号として使われるからです。
パズル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"