トップページ > プログラム > 2016年10月04日 > rJSgKoMJ

書き込み順位&時間帯一覧

7 位/186 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000211015



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
717
Java入門・初心者質問スレ [無断転載禁止]©2ch.net

書き込みレス一覧

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));

}
}
こんなのどうでしょう?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。