Java練習問題3参考解答と解析


1.クイズ
  • 関係演算子の演算結果はどのようなデータ型ですか?
  • if文の条件式の値はint型であってもよいですか?
  • while文の条件式の値は何ですか?
  • switch文ではdafaultオプションが必要ですか?
  • while文のループでbreak文を実行する効果は何ですか?
  • はwhile文の代わりにfor文を使うことができますか?

  • 問答問題の解析
    1.booleanタイプ(trueまたはfalse)2.いいえ、booleanタイプ3.booleanタイプ4.のみです.必須ではありませんが、コードのロバスト性を向上させるためにdefaultオプション5を追加することをお勧めします.5.while文の実行を終了する6.
    拡張forサイクルの紹介
    拡張型forループはforeachループとも呼ばれ、最も多くの応用は配列要素をループすることにある.
    Java
    int [] arr = {1,2,3,4,5};
    for(int n:arr)   //         n       arr      
      System.out.println(n);

    2.選択問題
    1.次のどの記述が正しいですか.A.5.0/2+10の結果double型データB.(int)5.8+1.0の結果int型データC.‘苹’+’果’の結果char型データD.(short)10+’a’の結果short型データ
    2.プログラムに表示された【コード】を次のどのコードで置き換えるとコンパイルエラーになりますか?A. m–>0 B. m++>0 c. m=0 D. m>100&&true
    Java
    public class E {
        public static void main(String args[]) {
            int m=10,n=0;
            while([  ]){
                n++;
            }
        }
    }

    Type mismatch: cannot convert from int to boolean
    3.「int x=1;」と仮定すると、次のどのコードが「精度を損なう可能性があり、intを見つけるにはcharが必要」というコンパイルエラーを引き起こすのでしょうか.A. short t = 12+’a’; B. char c = ‘a’+1; C. char m = ‘a’+x; D. byte n = ‘a’+1;
    選択問題の解析
    回答:1.A 2.C 3.C
    第1題Bは5.8を整数型に変換した後にまた1つのdouble型1.0を加えたので、結果は依然としてdouble型C文字とintが互いに変換することができ、2つの文字の加算は対応するunicode加算であるが、加算後のunicodeの値はcharの範囲(0-65535)より大きいのでchar文字で受信することはできず、intデータでD charを受信する精度はshortよりも高く、だからshortとcharの結果はcharです
    第2題whileループ条件はbooleanタイプであり、Cは付与文であるため、コンパイルエラーが発生します.=付与、==等しいことに注意してください.
    3番目の問題の精度が「低い」から「高い」までの順序は、byte->short->char->int->long->float->double Java算術式の値を計算する際に、次の演算精度ルールを使用します.(1)式にdoubleがある場合はdoubleで演算します.(2)式中の最高精度がfloatであればfloatで演算する(3)式中の最高精度がlongであればlongで演算する(4)式中の最高精度がintより低い場合、intで計算するJavaはbyte、short、charの値範囲を超えない算術式の値をbyte、short、charに与えることができる.aのASCIIコード値は97なので、Aオプション97+12がshortに値を与えることができるという問題の鍵はBとCの違いにある.xは1に等しいのではないかと言う人もいるが、「a」+xは「a」+1ではないか.なぜcが間違っているのか.なぜならchar c=’a’+1における’a’は文字型定数であり、1はデジタル定数であるからである.コンパイラがコンパイルされると、自動的にマージされ、タイプ変換は行われません.コンパイルフェーズで完了します.char m=’a’+x中’a’は文字型定数であるが、xは変数であり、コンパイル段階ではマージできず、実行時にのみコンパイルでき、実行時にはxが整数であることが判明し、’a’+xは自動的に整数に変換され、char型に直接付与できない.強い回転が必要です.(char)(‘a’+x)
    プログラムの問題を読む
    (1)次のプログラムの出力結果は何ですか.
    Java
    public class E {
        public static void main(String args[]) {
            char x=' ',y='e',z=' ';
            if(x>'A'){
                y=' ';
                z=' ';
            }
            else
                y=' ';
            z=' ';
            System.out.println(x+","+y+","+z);
        }
    }

    (2)次のプログラムの出力結果は何ですか.
    Java
    public class E {
        public static void main(String args[]) {
            char c = '\0';
            for (int i = 1; i <= 4; i++) {
                switch (i) {
                case 1:
                    c = 'J';
                    System.out.print(c);
                case 2:
                    c = 'e';
                    System.out.print(c);
                    break;
                case 3:
                    c = 'p';
                    System.out.print(c);
                default:
                    System.out.print(" ");
                }
            }
        }
    }

    (3)次のプログラムの出力結果は何ですか.
    Java
    public class E {
        public static void main(String args[]) {
            int x=1,y=6;
            while(y-->0){
                x--;
            }
            System.out.println("x="+x+",y="+y);
        }
    }

    リーダ解析
    第1題の答えは:あなた、リンゴ、甘い‘あなた’の文字番号は‘A’より大きいのでif中文を実行して、elseが括弧を大きくしていないことに気づいて、だからz=’甘い’;必ず実行します.
    第2題の答えは:Jeepはよくswitchの中の1つのcaseの後ろにbreakが付いていないならば、プログラムはbreakあるいはswichが終わるまでずっと実行します.従って、1回目のループ出力Jとe、2回目の出力e、3回目の出力pと良く、4回目の出力が良い.
    第3題の答えは:x=-5,y=-1この問題の重点はwhileの判断条件がy->0で、自減が後なので、まずyの大きさが0より大きいかどうかを判断して、それから自減します.ループが条件を満たしていなくても,判定操作を行えば必ず自滅する.yが6から1に減少してもサイクル条件を満たすと算出できるので、サイクルは6回実行され、xは6回減少し、結果は-5であり、このときyの値は0である.再びサイクル条件を判断し,条件を満たさないことが判明し,サイクルを脱退し,yは自己減少し,−1となった.