HOME»基本情報技術者試験掲示板»平成30年秋期午後問11
投稿する

[3288] 平成30年秋期午後問11

 つっきーさん(No.1) 
https://www.fe-siken.com/kakomon/30_aki/pm11.html
TemplateParseクラスにおいて、int c として宣言され、switch(c)の文で、cが文字の変数として扱られているように見えるのですが、これはどう考えたらよろしいでしょうか。
2021.05.11 14:04
GinSanaさん(No.2) 
FE シルバーマイスター
最初あれ?って思いましたが、よくよく考えたら似たようなことを考えたやつがスタックオーバーフローにいました。
stackoverflow.com/questions/38595101/switch-case-with-character-and-ascii-value-behave-same-in-java

まず、read()で読み込んだ文字はASCIIコードになるのは
docs.oracle.com/javase/jp/8/docs/api/java/io/Reader.html
公式サイトにも書いていることです(戻り値は0 - 65535 (0x00-0xffff)の範囲の整数としての、読み込まれた文字。ストリームの終わりに達した場合は -1)。
で、charは0から65535の範囲の符号なし整数であり(※)、Javaが動くコンピュータがUnicode をサポートしていると仮定して、その番号に対応するUnicode文字として出力されるわけです。

docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
より
char データ型は16ビットUnicode文字です。最小値は '\u0000' (または 0) で、最大値は '\uffff' (または65,535を含む) です。

    public static void main(String[] args) {

        for (Character cRef = 'A'; cRef < 'F'; cRef++)
            switch (cRef) {
            default:
                System.out.println((char) ('a' + cRef - 'A'));
                break;
            case 'B':
                System.out.println(cRef);
                break;
            case 68:
                System.out.println(cRef);
                break;
            case 67:
                System.out.println(cRef);
            }
    }

たとえばプログラムは "68" または 'D' に設定されているため、どちらでも同じものとして読み取られます。

2021.05.11 17:40
GinSanaさん(No.3) 
FE シルバーマイスター
となると、<は60、>は62なので、60とか書いとけば直感的には違和感はないですが、それだとasciiコード表を載せないと「?」としかならないので、そういう書き方をしたのでしょう。
こういう直値で書くのは、よくawkであるのですが(シングルクォートを必ず\047で示すとか)、Javaはまあ、いまどきこんなの意識しませんからねえ。
2021.05.11 17:59
 つっきーさん(No.4) 
GinSanaさん
説明いただきありがとうございます。
納得できました。
2021.05.11 20:43

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop