C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: インクリメントの結果が違ってしまいます


(過去ログ 49 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■27027 / inTopicNo.1)  インクリメントの結果が違ってしまいます
  
□投稿者/ naga (4回)-(2008/10/25(Sat) 07:02:17)

分類:[Java] 

2008/10/30(Thu) 22:42:05 編集(投稿者)

お世話になります。

Javaを用いて開発しているのですが、ループの中で

  this.iCnt = this.iCnt + 1; ---@

  (iCntはint型です)

と記述してインクリメントさせ開発しております。
下記2つの方法でもインクリメントさせたのですが、逆アセンブルを実行した結果、@のみ違う結果となります。

  this.iCnt += 1; ---A

  this.iCnt++1;  ---B

JDKのバージョンは、JDK1.4.2です。
OSはWindows2000Professional SP4

@ABは同じことをやっているように思えるのですが、コンパイラ内部で何か違う処理をやっているのでしょうか?

原因や、JDKのバグ等の情報をご存知の方がおられましたら、ぜひご教授お願いいたします。
引用返信 編集キー/
■27028 / inTopicNo.2)  Re[1]: インクリメントの結果が違ってしまいます
□投稿者/ Jitta on the way (199回)-(2008/10/25(Sat) 08:32:12)
No27027 (naga さん) に返信

3は、コンパイルとおるの?
普通は、ループの回数を調べます。
引用返信 編集キー/
■27029 / inTopicNo.3)  Re[2]: インクリメントの結果が違ってしまいます
□投稿者/ ぽぴ王子 (405回)-(2008/10/25(Sat) 08:34:33)
ぽぴ王子 さんの Web サイト
No27027 (naga さん) に返信

> ところが先日、2回同じ処理を流した結果の件数が異なるという報告が来ました。

件数が異なるのはわかりますが、どう違うのですか?
そこが今回の一番のキモだと思うんですが、それを省略したら誰もわかりませんよ。

> 試しに下記2つの方法でインクリメントさせたのですが、逆アセンブルを実行した結果、@のみ違う結果となります。

もしかして:逆コンパイル
Jad とか JODE とかを使って逆コンパイルしてみたということですか?
これも上記と一緒ですが、違うだけ言われても「どこがどう違ってどうなっているのか」を
示してくれないと、誰もわかりません。

>   this.iCnt = this.iCnt + 1; ---@
>
>   this.iCnt += 1; ---A
>
>   this.iCnt++1;  ---B

> @もAもBも同じことをやっているように思えるのですが、コンパイラ内部で何か違う処理をやっているのでしょうか?

コンパイラの内部の流れはコンパイラを作った人間ではないのでなんとも言えないです。
ただ、自分であれば@はほぼ間違いなく使いません。++ や += が使えない VB の場合ぐらいでしょうか( += は今の VB は使えますけどね)
あとBの ++1 ってコンパイル通ります?もしかしたら通るのかもしれないけど、こう書いたことがないのでなんとも。

> 原因や、JDKのバグ等の情報をご存知の方がおられましたら、ぜひご教授お願いいたします。

JDK の問題と考えたら、とりあえず Sun に問い合わせてみるのもいいんじゃないでしょうか。
というか製造元に問い合わせるのは基本中の基本だと思います。
引用返信 編集キー/
■27030 / inTopicNo.4)  Re[3]: インクリメントの結果が違ってしまいます
□投稿者/ naga (5回)-(2008/10/25(Sat) 09:26:08)
No27029 (ぽぴ王子 さん) に返信

> 件数が異なるのはわかりますが、どう違うのですか?
> そこが今回の一番のキモだと思うんですが、それを省略したら誰もわかりませんよ。

ステップ実行すると、
@の方法だと、変数 iCnt に何回かに一度2が加算されます。
A、Bでは必ず1が加算されます。


引用返信 編集キー/
■27032 / inTopicNo.5)  Re[4]: インクリメントの結果が違ってしまいます
□投稿者/ ま (147回)-(2008/10/25(Sat) 11:40:51)
No27030 (naga さん) に返信

Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。
トークン "++" に構文エラーがあります。AssignmentOperator が無効です。

at Test5.main(Test5.java:17)


public class Test5 {

/**
* @param args
*/
int iCnt1;
int iCnt2;
int iCnt3;
public static void main(String[] args) {

Test5 t = new Test5();
for (int i=0;i < 20;i++) {
t.iCnt1 = t.iCnt1 + 1;
t.iCnt2 += 1;
t.iCnt3++1;
System.out.println("iCnt1=" + t.iCnt1 + " iCnt2=" + t.iCnt2 + " iCnt3=" + t.iCnt3);
}


}

}

ということです。
Javaってコンパイル失敗していてもClass ファイルできちゃうから厄介ですよね。

iCnt++1;
が文法でOKなら、
int iCnt = ++0;
もOKですよね?

何か書き漏らしているか、はしょってる部分を明らかにすべきだと思いますね。


iCnt++1;

こんな書き方は小学生でもやらないです。


Eclipse3.2 JDK1.6


int x = t.iCnt3 + +1;
これならコンパイルとおります。



引用返信 編集キー/
■27033 / inTopicNo.6)  Re[5]: インクリメントの結果が違ってしまいます
□投稿者/ ま (148回)-(2008/10/25(Sat) 12:05:07)
No27032 (ま さん) に返信
> ■No27030 (naga さん) に返信
>
> Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。
> トークン "++" に構文エラーがあります。AssignmentOperator が無効です。
>
> at Test5.main(Test5.java:17)

1.3 〜 1.6 まで試しました。


引用返信 編集キー/
■27036 / inTopicNo.7)  Re[5]: インクリメントの結果が違ってしまいます
□投稿者/ naga (6回)-(2008/10/25(Sat) 13:59:14)
2008/10/25(Sat) 19:45:39 編集(投稿者)

No27032 (ま さん) に返信

> iCnt++1;

すみません。
質問の箇所のthis.iCnt++1;は書き間違えでした。
this.iCnt++;です。

for (int i=0;i < 20;i++) {
t.iCnt1 = t.iCnt1 + 1;
t.iCnt2 += 1;
t.iCnt3++;
System.out.println("iCnt1=" + t.iCnt1 + " iCnt2=" + t.iCnt2 + " iCnt3=" + t.iCnt3);
}

この状態で実行すると、t.iCnt1 = t.iCnt1 + 1; の部分だけ+2されたり、+1されたりします。。。

解決済み
引用返信 編集キー/
■27069 / inTopicNo.8)  Re[6]: インクリメントの結果が違ってしまいます
□投稿者/ 凪瀬 (81回)-(2008/10/27(Mon) 12:30:28)
No27036 (naga さん) に返信
> for (int i=0;i < 20;i++) {
> t.iCnt1 = t.iCnt1 + 1;
> t.iCnt2 += 1;
> t.iCnt3++;
> System.out.println("iCnt1=" + t.iCnt1 + " iCnt2=" + t.iCnt2 + " iCnt3=" + t.iCnt3);
> }
>
> この状態で実行すると、t.iCnt1 = t.iCnt1 + 1; の部分だけ+2されたり、+1されたりします。。。

当方で該当コードを動かしてみましたが、そのような現象は確認できませんでした。
Sun製のJRE1.6.0でWindows Vista上で確認。

最適化関連でバイトコードのオーダ変更が変な形でされているとか、あるいは該当JREのバグか。並列系だと同期関連バグなんじゃないの、というところですが…。いかんせん、言語仕様的な理由ではないでしょうね。
引用返信 編集キー/
■27172 / inTopicNo.9)  Re[7]: インクリメントの結果が違ってしまいます
□投稿者/ naga (7回)-(2008/10/29(Wed) 21:59:46)
2008/10/30(Thu) 22:53:02 編集(投稿者)
2008/10/30(Thu) 22:46:10 編集(投稿者)
2008/10/30(Thu) 22:38:32 編集(投稿者)

No27069 (凪瀬 さん) に返信

> 最適化関連でバイトコードのオーダ変更が変な形でされているとか、あるいは該当JREのバグか。並列系だと同期関連バグなんじゃないの、というところですが…。いかんせん、言語仕様的な理由ではないでしょうね。

返信ありがとうございます。

この件は解決しました。

セットに入れてカーディナリティを取得することにしました。

みなさんありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -