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


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



アレサ

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


といいます。


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


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


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


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


アレサ 「あ、あなたはいったい 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=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です。


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


solarplexuss「


ちょっとまって」


マックス「なんだ?」


solarplexuss「


ちょっとまって


-a++;


では


++より先に-が


変数aに作用しているんじゃないかな?


作用しているんだけど


最後にa++


が実行されるので


aに格納される値は


10が1増えて11になっていると思うよ


たとえば


5-a++:


が実行されたなら


5-aが実行された後


最後にa++


が実行されるので


aに格納される値は


10が1増えて11になるよね


だから


-a++;


では


++より先に-が


変数aに作用しているんじゃないかな?


ただ


・・・

5-a++:



-は


2項演算子


-a++;



-は


単項演算子


だから


5-a++:


が実行されたなら


5-aが実行された後


最後にa++


が実行されるので


aに格納される値は


10が1増えて11になるといっても



-a++;


では


++より先に-が


変数aに作用しているとはいえない


やっぱり


aに++が作用した後


aに-が作用しているかもしれないんだけど・・・」



マックス「ううむぅ」



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


アレサももちろんな!」


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


アレサも さあ」


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



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


パチコーン


パチコーン


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


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


ソーラー 「はあ、はあ」


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


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


マックス

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


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


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


アレサ「


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


#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でない私の統合開発環境EAZY IDECのコンパイラの場合


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のままとなります


ですので


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


プログラムの実行結果に表示されるのは


aの値は10です。


となります。


Visual Studioで


a=10;

a=a++;


が実行される場合


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


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


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


変数aに代入され


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



よって


プログラムの実行結果に表示されるのは


aの値は11です。


となります。


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


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


不思議だ・・・」


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




😊/  😊/



このプログラムのような


👇


#include <stdio.h>


int main (void)

{

int a;

a=10;

a=-a++;

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

return 0;

}


👆


a=-a++;


のような記述方法は


統合開発環境が違えば


つまり


コンパイラ


が違えば


異なった結果が表示されます


ですので


a=-a++;


のような記述は


使わない方がよいですね(*´▽`*)



















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る