足し算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ken100

足し算

#1

投稿記事 by ken100 » 5年前

ど素人です。

i++と
i=i+1の結果は同じになりますか?

i++は無限になりますが、
i=i+1は1のままになります。
なぜでしょうか?

Math

Re: 足し算

#2

投稿記事 by Math » 5年前

この様な使いかたが多いと思いますが

コード:

」
#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

同じですよね!

Math

Re: 足し算

#3

投稿記事 by Math » 5年前

次のようにして +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;
}

コード:

C:\19\19c\c2017>main.exe
0
1
2
3
4

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 足し算

#4

投稿記事 by みけCAT » 5年前

ken100 さんが書きました:
5年前
i++は無限になりますが、
i=i+1は1のままになります。
なぜでしょうか?
これは残念ながら私には意味がよくわかりませんが、
ken100 さんが書きました:
5年前
i++と
i=i+1の結果は同じになりますか?
状況によります。

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言語やC++においても、異なる結果になるケースはここに書いただけとは限りません。
まず、処理系の実装(バグがある可能性も否定できません)やオプションなどが影響する可能性があります。
さらに、これまで「結果」として実行結果を考えてきましたが、
コンパイル結果(生成されるアセンブリ言語または機械語)も「結果」といえるでしょう。
そして、このコンパイル結果も、処理系の実装やオプション(特に最適化の設定)などにより、
同じになるかもしれないし、異なるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Math

Re: 足し算

#5

投稿記事 by Math » 5年前

int i=0;

printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);
printf("%d\n", i++);

i=0
i=i+1
printf("%d\n", i);
printf("%d\n", i);
printf("%d\n", i);
printf("%d\n", i);

の違いをいってると思うが


i++ は単項演算子
i はただの変数だからですよ。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 足し算

#6

投稿記事 by みけCAT » 5年前

Math さんが書きました:
5年前
i++ が単項演算子であり
Math さんが書きました:
5年前
i++ は単項演算子
i++ は単項演算子ではありません。
識別子(変数?)と単項演算子を組み合わせた式です。
オフトピック
よく読んでいなかったため、最初の投稿の段階で気付くことができませんでした。
申し訳ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る