上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
お久しぶりです!
ゆってぃです!

サボりっぱなしでごめんなさい…

さて、今日は表題にあるように、演算子の罠についてお話します。

まず、次のコードを見てください。
(コンパイラはgccです)

--

void main(void){

 int i = 0;
 int *p;

 p = &i;

 *p++;

 printf("i = %d",i);

}

--

出力される値は「i = 0」です。

「え、普通じゃん。お前バカ??」

という方は、すみません・・・おっしゃるとおりです(汗)

でも、少しでも違和感を感じた方もいると信じて、続きを書きます。

「あれ?*p++の時点で、iがインクリメントされる気が…」

そう!ゆってぃはそう感じてほしかった!!

でも、実は後置増分演算子(++)は、間接参照演算子(*)よりも優先順位が高いのです。

つまり、*p++では、「ポインタ変数のpをインクリメントしたアドレスを参照」しているだけで、データの書き換えは起こっていないのですね。

もし、p経由でiをインクリメントさせるなら、以下のように書かなければなりません。

--

void main(void){

 int i = 0;
 int *p;

 p = &i;

 (*p)++;

 printf("i = %d",i);

}

--

意外と落とし穴っぽいでしょ?(笑)

え?そんなの高校生でも知ってるって?
またまたぁ、そんなに僕をいじめないで下さいよ…(T_T)

今日は少ないですがここまでです!

最後まで読んでくれてありがとう><
関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。