- Java入門・初心者質問スレ [無断転載禁止]©2ch.net
717 :デフォルトの名無しさん[]:2016/10/04(火) 19:04:40.41 ID:rJSgKoMJ - public static void main(String[] args) {
int i = 2; System.out.println(1+i++); } が3になるのはなぜでしょうか?
|
- Java入門・初心者質問スレ [無断転載禁止]©2ch.net
720 :デフォルトの名無しさん[sage]:2016/10/04(火) 19:34:21.50 ID:rJSgKoMJ - >>719
ありがとうございます。 >処理が終わった後+1 という点ですが、どういう事が起きれば"処理が終わった"ということになるのでしょうか? 例えば、 int i = 2; System.out.println((double)(i++)); //出力2 だと、自分の頭の中では、i++した後に、double型への変換という"処理が終わった"から3になっていて欲しいと考えてしまうんですが。 根本的に頭おかしかったらすみません・・・
|
- Java入門・初心者質問スレ [無断転載禁止]©2ch.net
726 :717[sage]:2016/10/04(火) 20:59:41.12 ID:rJSgKoMJ - すみません。キャストとか何も考えずにですが、頭まとまってないままレス書いてます。
int i = 2; System.out.println(++i); の場合 0 : iconst_2 //int型の2をオペランドスタックにpush 1 : istore_1 //ローカル変数領域の1番目に2を格納(0番目は違うデータ) 2 : getstatic #16 //System.out.PrintStream 5 : iinc 1, 1 //1番目のローカル変数(ここではi(=2))を1インクリメントする 8 : iload_1 //ローカル変数 i をオペランドスタックへpushする 9 : invokevirtual #22 //println実行 int i = 2; System.out.println(i++); の場合 0 : iconst_2 1 : istore_1 2 : getstatic #16 5 : iload_1 //ローカル変数 i をオペランドスタックへpushする 6 : iinc 1, 1 //1番目のローカル変数(ここではi(=2))を1インクリメントする 9 : invokevirtual #22 これだと、 ++i の場合、ローカル変数領域でインクリメントした値をオペランドスタックにプッシュしてprintlnしている。 i++ の場合、iをオペランドスタックにプッシュした後、ローカル変数領域でインクリメントしている。 つまり、printlnで出力される値はオペランドスタック内での値で、インクリメントされるのはローカル変数領域の値。 ローカル変数領域の値をインクリメント前後のどっちのタイミングで取り出すかで結果が違った。 これでいいんでしょうか?
|
- Java入門・初心者質問スレ [無断転載禁止]©2ch.net
729 :デフォルトの名無しさん[sage]:2016/10/04(火) 21:10:07.17 ID:rJSgKoMJ - >>727
ありがとうございます。 そのケースだと、最初の(i++(値は2))+((i++)左でインクリメントされて3) で、合計5になると思います。だいぶスッキリしました。
|
- Java入門・初心者質問スレ [無断転載禁止]©2ch.net
733 :デフォルトの名無しさん[sage]:2016/10/04(火) 23:37:38.44 ID:rJSgKoMJ - >>730
public static void main(String[] args) { LocalDate date = LocalDate.now(ZoneId.systemDefault()); for(int i = 0; i < 10; i++){ LocalDate date2 = date.minusMonths(i); System.out.println(date2.format(DateTimeFormatter.BASIC_ISO_DATE)); } } こんなのどうでしょう?
|