電子書籍の厳選無料作品が豊富!

インクリメント演算子について

プログラミング超初心者です。
大学のプログラミングの課題で
インクリメント演算子を使って
数字をひとつずつ大きく(小さく)していくという課題が出ました
私が作ったプログラムは以下のとおりです

#include <stdio.h>
int main(void)
{
int x ; //変数宣言

printf("整数値を入力してください:");
scanf("%d",&x);

printf("1ずつ増加\n");
printf("%d,",x++);
printf("%d,",x++);
printf("%d,",x++);
printf("%d,",x++);
printf("%d\n",x);
printf("1ずつ減少\n");
printf("%d,",x--);
printf("%d,",x--);
printf("%d,",x--);
printf("%d,",x--);
printf("%d\n",x--);
}
ちなみに、整数値は10にしました。

結果は
1ずつ増加
10,11,12,13,14
1ずつ減少
14,13,12,11,10

と、望んでるものになったのですが、疑問があるので質問させていただきます。
xを変数にすると、x++はx+1になると思うのですが表示されたのは10、11、…と
10から表示されました。
しかも、増加していった最後のxはなぜ14になるのでしょうか?
課題は出来たのですが、頭が混乱しています…
詳しく解説をお願いします。

A 回答 (3件)

x++は(プリインクリメントといいます)インクリメント演算子を使わないと


misaki-hina さんの書かれているように x=x+1; と書くことになりますが
1行の中に複数の命令(?)orintfとx++がありますので、
どちらが先に実行されるかが問題になります。

実行コード順で展開した風にを書き直すと
printf("1ずつ増加\n");
printf("%d,",x++);
printf("%d,",x++);
printf("%d,",x++);
printf("%d,",x++);
printf("%d\n",x);

printf("1ずつ増加\n");
printf("%d,",x);  この時xは10
x=x+1;       ここでxは11
printf("%d,",x);
x=x+1;
printf("%d,",x);
x=x+1;
printf("%d,",x);
x=x+1;
printf("%d\n,",x);
という風に展開して書けます。
ちなみに
 printf("%d,",++x);

 x=x+1;
 printf("%d,",x);
となります。
インクリメント、デクリメントは便利ですけどちょっとややこしいですよね!
    • good
    • 0
この回答へのお礼

なるほど
確かにややこしいですね
でも、なんとなくですが、分かった気がします。
これからもっと勉強して、もっと理解できるようにしたいです!!
ありがとうございます(^^)

お礼日時:2010/10/11 22:40

>詳しく解説をお願いします。



理由というか動作は#1のedomin7777さんのおっしゃる通りです。

大学生ということで、一つアドバイスをすると、

C言語というのは、設計された当時にシステムーすなわちOSを効率よく記述することを目標に設計されました。
当時は大型コンピュータでさえ、メモリが1Mbyteあれば大容量という時代でしたから、そういう資源の制約の中でなるべく効率よくアセンブラのプログラムに変換できる言語として策定されたのがC言語です。当時の最新マシンはDEC(現在HP)のPDP11でした。C言語はPDP11で効率よく動作されるように設計されており、PDP11のアークテクチャを色濃く反映すようになっています。

そういうことで、学生さんでしたら温故知新でDECの
PDP7, PDP8, PDP11, VAX11
のCPUのアークテクチャを詳しく研究してみることをお薦めします。
    • good
    • 0
この回答へのお礼

まだC言語を勉強し始めたばかりなので
プログラムはなかなか難しいですね(^^;)
これからもっと勉強していきたいと思います!!
ありがとうございました!!

お礼日時:2010/10/11 22:44

評価する順番が大切。



x++
で、xを評価してからインクリメントします。

なので、最初のprintf文は10の後インクリメントして11になります。
インクリメントしてから評価するには++xとします。
    • good
    • 0
この回答へのお礼

x++と++xは違うんですね(..;)
なかなかややこしそうですが、もっと勉強したいと思います
ありがとうございました!!

お礼日時:2010/10/11 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!