それでは++a++;はどのようにプログラム内で実行されるのでしょうか?

ソーラー「では 


     ++a++;はどうプログラム内ではたらくのかな?」


プログラムを組んで確かめてみようっ\(^o^)/


#include <stdio.h>


int main (void)

{

int a;

a=10;

++a++;


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


return 0;

}


コンパイル結果は


EAZY IDECの場合


ファイル「C:/Users/solarplexus/AppData/Local/EasyIDEC/project/1234566/main.c」の

「7行目」で記述エラーを発見しました。

「lvalue」を付け忘れています。


となります。


どうやら「lvalue」はleft valueの短縮した文字のようで


left valueは左側の値、をあらわしています


よって


このコンパイルエラー表示では


++a++ の左側に足すべき数値が書かれていないことをあらわしています。


つまり、本来は


□+(+a)++のように左側の□のなかに足すべき数値を持ってきて下さいと


コンパイラは警告しているわけです。


つまり


この私のつかっているコンパイラは


++a++を


□+(+a)++のような構造になっているととらえているわけです。


(みなさまのお持ちのコンパイラによっては


++a++を違う解釈でとらえているものがあるかもしれませんね。)


そして


単項演算子+のはたらきにより


+a=aなので


□+(+a)++=□ + a++


と私のコンパイラは認識しています。


Visual Studioの場合


エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります Project11 c:\Users\solarplexuss\source\repos\Project11\Source.cpp 7

エラー C2105 '++' には左辺値が必要です。 Project11 c:\users\solarplexuss\source\repos\project11\source.cpp 7


と表示されます。


こちらも


統合開発環境EAZY IDECと同じ内容のエラー文を


表示しています。



                    solarplexussより


solarplexuss「う~ん


おもしろくなってきたね~。」


ソーラー「なあるほど


++a++;



□+(+a)++;



コンパイラは認識している


だから□の中になにか数値か数値を格納した変数を


持ってきてくださいと


コンパイラはエラー文を表示しているわけなんだね。」


ソーラー「ではでは


□に数値10を代入して


b=10+a++としたものを元のプログラムに組み込んで


aに値を代入すると


bは


どのような値が表示されるかみていこうかな😊」


#include <stdio.h>


int main (void)

{

int a;

int b;

a=10;

b=10+a++;


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

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

return 0;

}

それ、それ、コンパイルル~~っと♪♪」


アレサ 「


a=10;

b=10+a++;


のプロセスにおいて


bの値が


b=10+10


となるのか


b=10+11


となるのかが、このプログラムのみどころですね?」


ソーラー 「えっそうだったの? は・は・はは・・・


いや~適当にプログラム組んだだけなんだよ・・


でも、そうだね どのような結果になるか楽しみだね。」


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


ソーラー 「コンパイル結果は・・・」


コンパイル結果


aの値は11です

bの値は20です


ソーラー 「おおおおおっっ


わおっぅ


でました、


a=10;

b=10+a++;


のコンパイル結果が


🍓🍓🍓🍓🍓🍓

aの値は11です

bの値は20です

🍓🍓🍓🍓🍓🍓


ここはまちがえやすいと思うな・・・


普通

a=10;

b=10+a++;だったら

a++;により あの値は11になるから

b=10+11=21


と考えそうだよね~~~~~」


アレサ


「000000001111・・・


先ほどのエピソードのときと同じように


b=10+a++;において


単項演算子++より二項演算子+や=の操作の方が優先されて


b=10+a=10+10=20となったそのあとで


単独でaに++が作用し


a=11となっているのですね。


ふ~むぅ10000111111111111・・・・


みなさん、ご注意してくださいね。\(^o^)/」


マックス 「さすがに、


a=10;

b=10+a++;



b=20となるか?

b=21となるか?



この判断はまちがえやすいぞ\(^^)/」


アレサ「いま 誰かの声がきこえてきませんでした?」



ソーラー

「うん? いや  別に(^_-)-☆


気のせいじゃないかな?


そうだね・・・


ではa++を()括弧でくくった


a=10;

b=10+(a++);なら


bの値は21になるんじゃないかな?」


アレサ


「では、そのプログラムをコンパイル


してみます。


#include <stdio.h>


int main (void)

{

int a;

int b;

a=10;

b=10+(a++);


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

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

return 0;

}


アレサ 「コンパイル(*´▽`*)」


コンパイル結果


EAZY IDECの場合

Visual Studioの場合


aの値は10です

bの値は20です


ソーラー 「あららっ()括弧でくくっているのに


bの値は20です。となっているか・・・


Visual Studioでもそうなっているよね。


a=10;

b=10+(a++);と括弧でくくっても


b=10+(11);


b=21とはならない(^^)/か・・・


ここでも()に関係なく


b=10+10が優先されてるんだね。」


アレサ「00111111111・・・


そうなんですの・・・


そうっ


bの値を21にしたいなら


つぎのプログラムのように


a++をb=10+(a++);から分離してみては


いかがでしょうか?


#include <stdio.h>


int main (void)

{

int a;

int b;

a=10;

a++;

b=10+a;


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

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

return 0;

}

そうすれば


bの値は21になるかもしれません。」


ソーラー 「なんか、いいね。


a++ ;を b=10+a;のまえに単独表記


なんだか 行けそうな気がする~~~~~~~~」


ソーラー 「それではっ💖



コンパイル!」



ソーラー「


コンパイル結果はっと」


コンパイル結果


EAZY IDECの場合

Visual Studioの場合


aの値は11です

bの値は21です



ソーラー「


おおっでたか・・

bの値は21


まあ、でも


コンパイル結果が

aの値は11です

bの値は21です


となる


さきほどの


a=10;

b=10+a++;の表記がまちがっているわけではないよ。


そのプログラムの局面によっては


aの値は11です

bの値は21です


ではなく


aの値は11です

bの値は20です


にしたいときもあるだろうからね」





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

作者を応援しよう!

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

応援したユーザー

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