平成30年秋期午後問11
つっきーさん
(No.1)
https://www.fe-siken.com/kakomon/30_aki/pm11.html
TemplateParseクラスにおいて、int c として宣言され、switch(c)の文で、cが文字の変数として扱られているように見えるのですが、これはどう考えたらよろしいでしょうか。
TemplateParseクラスにおいて、int c として宣言され、switch(c)の文で、cが文字の変数として扱られているように見えるのですが、これはどう考えたらよろしいでしょうか。
2021.05.11 14:04
GinSanaさん
★FE シルバーマイスター
(No.2)
最初あれ?って思いましたが、よくよく考えたら似たようなことを考えたやつがスタックオーバーフローにいました。
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を含む) です。
たとえばプログラムは "68" または 'D' に設定されているため、どちらでも同じものとして読み取られます。
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);
}
}
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さん
★FE シルバーマイスター
(No.3)
となると、<は60、>は62なので、60とか書いとけば直感的には違和感はないですが、それだとasciiコード表を載せないと「?」としかならないので、そういう書き方をしたのでしょう。
こういう直値で書くのは、よくawkであるのですが(シングルクォートを必ず\047で示すとか)、Javaはまあ、いまどきこんなの意識しませんからねえ。
こういう直値で書くのは、よくawkであるのですが(シングルクォートを必ず\047で示すとか)、Javaはまあ、いまどきこんなの意識しませんからねえ。
2021.05.11 17:59
つっきーさん
(No.4)
GinSanaさん
説明いただきありがとうございます。
納得できました。
説明いただきありがとうございます。
納得できました。
2021.05.11 20:43
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告