ど素人です。
i++と
i=i+1の結果は同じになりますか?
i++は無限になりますが、
i=i+1は1のままになります。
なぜでしょうか?
足し算
Re: 足し算
この様な使いかたが多いと思いますが
実行する。(VS2017Community 使用)
http://www2.koyoen.birdview.co.jp/~abcx ... -12-b-.PNG
同じですよね!
」
#include <stdio.h>
int main(void)
{
int infinity;
infinity=5;
for(int i=0; i<infinity; i++){
printf("%d ",i);
}
printf("\n\n");
for(int i=0; i<infinity; i=i+1){
printf("%d ",i);
}
return 0;
}
実行する。(VS2017Community 使用)
http://www2.koyoen.birdview.co.jp/~abcx ... -12-b-.PNG
同じですよね!
Re: 足し算
次のようにして +1 されるのは i++ が単項演算子であり
printf 文の中で +1 が行われる!のですよ。
この様な勘違いがあるためいまは i++ のような書き方は多用すべきでないといわれています。
コンパイラが最適化してくれるので分かり易い書き方の方を優先するべきです。
printf 文の中で +1 が行われる!のですよ。
この様な勘違いがあるためいまは i++ のような書き方は多用すべきでないといわれています。
コンパイラが最適化してくれるので分かり易い書き方の方を優先するべきです。
#include <stdio.h>
int main(void)
{
int i=0;
printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);
return 0;
}
Re: 足し算
これは残念ながら私には意味がよくわかりませんが、
状況によります。
C言語においては、iが普通の変数であり、
これら単独でセミコロンを付けて文にした場合は、ほぼ同じになると考えられます。
ただし、文脈によっては、以下のような違いが発生します。
- i++は1を足す前の値に評価されますが、i=i+1は1を足した後の値に評価されます。
そのため、これらの式の値を代入や条件分岐などに使用する場合、結果が異なる可能性があります。 - iがatomicな型の場合、i++ではインクリメントがアトミックに行われますが、
i=i+1ではアトミックに行われるという規定がありません。(参照:N1570)
したがって、i++では発生しない競合がi=i+1では発生する可能性があります。 - i++ではiが1回評価されますが、i=i+1ではiが2回評価されます。
そのため、iがマクロとして定義され、マクロの展開先が副作用を含む場合、結果が異なる可能性があります。
このときにも結果が異なる可能性があります。
その他の言語においても、それらの言語の規格や処理系の実装(バグがある可能性も否定できません)により、
結果が異なる可能性が考えられます。
C言語やC++においても、異なる結果になるケースはここに書いただけとは限りません。
まず、処理系の実装(バグがある可能性も否定できません)やオプションなどが影響する可能性があります。
さらに、これまで「結果」として実行結果を考えてきましたが、
コンパイル結果(生成されるアセンブリ言語または機械語)も「結果」といえるでしょう。
そして、このコンパイル結果も、処理系の実装やオプション(特に最適化の設定)などにより、
同じになるかもしれないし、異なるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)