単項演算子+とー、二項演算子++の仕組みをくわしくみていきましょう。コンパイラによっては演算子は違った働き方をしてきます。

アレサ

「ひとつのオペランド(単項)に作用する演算子を単項演算子


といいます。


ここでは単項演算子+と-の仕組みについてみていきましょう。」


マックス「うおぉぉっぉぉぉぉぉぉぉ~~~~~~~


燃えてきたぜぇぇぇぇぇぇぇぇぇぇ~~~


何かできそうだぜぇぇぇぇぇい。」


アレサ 「あ、あなたはいったい 000000000・・・・・」


マックス 「俺か?  俺の名は・・・マックスだ・・・。」


ソーラー「マックス・・・あなたもこちらの世界にきていたんですか?」


マックス「だって アレサとソーラーだけで楽しそうなこと


をやっているじゃないか・・


俺も参加したいぞい。じゃない、参加したいじゃないか?」


アレサ 「こちらの方は


ソーラーさんのお知り合いの方なのですか?」


ソーラー 「そうだよ、アレサ、彼とは古くからの長い


つきあいでね。」


マックス 「そういうわけだ、ははっ よろしくたのむ、な


アレサ!」


手を差し出すマックス。


アレサ 「ようこそ、いらっしゃいました。



           この広大なヘキサ構造体の世界へ  



共に学んでいきましょう。」


がっちり握手を交わす アレサとマックス。


マックス


「共に学んでゆこう。アレサ。」


ソーラー 「いま、ちょうど単項演算子+と-について


創造力を働かせてみようとおもったところなんだ。」



マックス「単項演算子+は


+aのようにつかわれ


+a=aの作用がある。


単項演算子-は


-aのようにつかわれ


-a=-aの作用がある。


というところかな。」


ソーラー 「ぷはは  これは普通の数学とまったく一緒だね。」


マックス


「次のプログラムのように


a++;



a=a+1;


をあらわし変数aが今格納している値に1を加えたものを


変数aに代入する働きがあるんだろう?


#include <stdio.h>


int main (void)

{

int a;


a=10;

a++;


printf("aの値は%dです\n",a);


return 0;


コンパイル結果は


a=11となる。」


ソーラー「

a++;


と記述するだけで


a=a+1;


があらわせているんだね。便利だね。


つまり 今のプログラムは


つぎのプログラム


#include <stdio.h>


int main (void)

{

int a;


a=10;

a=a+1;


printf("aの値は%dです\n",a);


return 0;

}


と一緒なんだね。」


マックス


「では、次のプログラムはどうかな?」


#include <stdio.h>


int main (void)

{

int a;

a=10;

a++;

a++;

a++;

a++;

a++;

printf("aの値は%dです\n",a);


return 0;

}


ソーラー 「/コンパイル/」


アレサ 「コンパイル結果はaの値は15です。


このようにa++;


を書き連ねてもいいんですね。01101111111」


マックス「では、-a++だとコンパイル結果はどうなるかな。」


ソーラー 「これもおもしろそうなプログラムですね。」


#include <stdio.h>


int main (void)

{

int a;

a=10;

-a++;


printf("aの値は%dです\n",a);


return 0;

}


アレサ「これはどうなっちゃうの?かしら・・?」


マックス「それではっコンパイルっ」


コンパイル結果


aの値は11です。


ソーラー

a=10;

-a++; において


んん・・・


++(インクリメント)単項演算子のはたらきにより


今、変数aが格納している値10に1を加えたもの


が変数aに代入されるので


変数aの格納している値は


11になる。


あとは


printf("aの値は%dです\n",a);


により


aの値は11です


が表示されて


それで終わりっと・・・


-a++;



-は変数aにかかってはいるけど


変数aの格納している値は11のままなんだね。」


アレサ 「そうですね。


今のプログラム👇をより理解するために

..............................................................

#include <stdio.h>


int main (void)

{

int a;

a=10;

-a++;

printf("aの値は%dです\n",a);

return 0;

}


コンパイル結果

aの値は11です

...............................................................


次のプログラムを実行されてみればいかがですか?


#include <stdio.h>


int main (void)

{

int a;

a=10;

-a;


printf("aの値は%dです\n",a);


return 0;

}


ソーラー「そうだね


単項演算子-が変数aにかかったとしても


変数aに格納されている値に変化が起きないことを確かめるのに


最適だね。(^_-)-☆


それでは


コンパイル!」


アレサ「


コンパイル結果は


aの値は10です。


となります。」


マックス

「なんとなくわかったような・・・気がする~~~」


ソーラー


「どうやら、まあ当然といえば当然なんだけど


-aと

-単項演算子が作用したとしても


aの格納している値自体に変化がでるわけじゃない。


だから

-a;

が実行されても


aの値は10です。


とコマンドプロンプト画面に表示されるんだね。」


マックス 「ソーラー、テニスしようぜ なあ!


アレサももちろんな!」


ソーラー 「いきなりなにを・・・いいとも


アレサも さあ」


アレサ「はい、ソーラーさん」



ここはまったく自由な世界・・・


パチコーン


パチコーン


アレサ 「ふたりともすごい、すごい・・・」


マックス 「ぜえ、ぜえ、」


ソーラー 「はあ、はあ」


マックス 「やるな、ソーラー」


ソーラー 「あいかわらずの素早い動きですね。マックス」


マックス

「今日は もう帰るとしよ・・・・・」


ソーラー「そういえば、私たちプログラムの解説を完璧にわすれてました。


まあ、いいや 今日はかえるとしよ・・・・・」


アレサ「


あれっこんなところにソースコードが・・・


#include <stdio.h>


int main (void)

{

int a;

a=10;

a=-a++;

printf("aの値は%dです\n",a);

return 0;

}


みなさん 通常は


a++;

のようにインクリメント演算子++はつかわれ


a=-a++;のように表記し


aに-a++を代入するということはありません。😊


                solarplexussより



マックス 「むぅ


             a=-a++;   


こ、これは・・・


ソーラー 「びみょ、い(なう、いの仲間です。)。」


アレサ 「コンパイル結果は


まず


       Visual Studioでない私のコンパイラの場合


aの値は-10です。となります」


ソーラー 「これは正直 普通は使われることのない


微妙な++(インクリメント)演算子の使い方で


a=10;

a=-a++;では


a=-aがまず実行されます


変数aに変数aが今、格納している値10に-をかけた-10が代入されるので


変数aの格納している値は-10となります。


そのあとa++が実行されます。


このように


-単項演算子が優先して実行されるか


++単項演算子が優先して実行されるか



お使いのコンパイラによって


かわります。


統合開発環境EAZY IDECのコンパイラでは


まず、a=-aが実行されると


a=-10となる。


そのあと


a++;


が実行されるのですが・・・


インクリメント演算子++のはたらきにより


変数aが今、格納している値-10に1が加えた-9が


変数aに代入され


変数aの格納している値は-9となるはずなのですが


a++;


は変数aの格納している値には作用せず


変数aの格納している値は-10のまま


コンパイル結果は


aの値は-10です。


となります


このあたりは


統合開発環境Visual Studioのコンパイラでは改良が加えられていて


a++;

が機能し


変数aが今、格納している値-10に1が加えた-9が


変数aに代入され


変数aの格納している値は-9となります。


ですので


コンパイル結果


aの値は-9です


が表示されます


a=10;

a=-a++;

を書き換えた


a=10;

a=a++;の場合でも


統合開発環境EAZY IDECのコンパイラでは


a=aが実行された後に


インクリメント演算子++は機能しません。


a=aが実行されると


変数aが格納している値は10となっています。


この後


a++が実行されるわけですが


インクリメント演算子++は


変数aが格納している値10に作用しないので


変数aが格納している値は10のままとなります


ですので


コンパイル結果に表示されるのは


aの値は10です。


となります。


Visual Studioでは改良が加えられているので


インクリメント演算子++が機能し


変数aが今、格納している値10に1が加えた11が


変数aに代入され


変数aの格納している値は11となります。



よって


コンパイル結果に表示されるのは


aの値は11です。


となります。


ソーラー 「なんでEAZY IDECのコンパイラでは


インクリメント演算子++が機能しないのかな?


不思議だ・・・」


マックス 「不思議なことがある方がおもしろい😊じゃないか」





















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます