それでは++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)++=□ + 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++;
のプロセスにおいて
10+aが優先され
10+10となり
さらに
b=10+10が優先され
bの値が
b=10+10=20
となるのか
a=10;
b=10+a++;
のプロセスにおいて
a++が優先され
b=10+11
となることにより
bの値は21になるのか
が、このプログラムのみどころですね?」
ソーラー 「えっそうだったの? は・は・はは・・・
いや~適当にプログラム組んだだけなんだよ・・
でも、そうだね どのような結果になるか楽しみだね。」
アレサ 「プログラムの実行結果は・・・」
ソーラー 「プログラムの実行結果は・・・」
プログラムの実行結果
aの値は11です
bの値は20です
ソーラー 「おおおおおっっ
わおっぅ
でました、
a=10;
b=10+a++;
のプログラムの実行結果が
🍓🍓🍓🍓🍓🍓
aの値は11です
bの値は20です
🍓🍓🍓🍓🍓🍓
ここはまちがえやすいと思うな・・・
普通
a=10;
b=10+a++;だったら
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;のまえに単独表記
なんだか 行けそうな気がする~~~~~~~~」
いけそうな気がする~~~
solarplexussより
ソーラー 「それではっ💖
コンパイル!」
ソーラー「
プログラムの実行結果はっと」
プログラムの実行結果
EAZY IDECの場合
Visual Studioの場合
aの値は11です
bの値は21です
ソーラー「
おおっでたか・・
bの値は21
まあ、でも
プログラムの実行結果が
aの値は11です
bの値は20です
となる
さきほどの
a=10;
b=10+a++;の表記がまちがっているわけではないよ。
そのプログラムの局面によっては
aの値は11です
bの値は21です
ではなく
aの値は11です
bの値は20です
にしたいときもあるだろうからね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます