回答編集履歴

1

追記

2020/04/26 11:49

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -93,3 +93,103 @@
93
93
 
94
94
 
95
95
  ところで、質問のプログラムは(scanf版でも)"12+34-56=[Enter]"と連続して入力してもちゃんと動作する、というのはわかってましたか? (一応の理屈はこの回答中に書かれてますけど)
96
+
97
+
98
+
99
+ 追記
100
+
101
+ ---
102
+
103
+ scanf版で"1[Enter]+[Enter]2[Enter]=[Enter]"と入力したときの動作を、コンピュータになったつもりでトレースしてみましょう。
104
+
105
+ 説明のため、一応プログラムに行番号をつけておきます。
106
+
107
+ ```C++
108
+
109
+ 1: scanf("%d", &sum);
110
+
111
+ 2: while(true){
112
+
113
+ 3: scanf("%c", &cp);
114
+
115
+ 4: if(cp == '=') break;
116
+
117
+ 5: scanf("%d", &a);
118
+
119
+ 6: switch (cp) {
120
+
121
+ 7: case '+':
122
+
123
+ 8: sum += a;
124
+
125
+ 9: break;
126
+
127
+ 10: case '-':
128
+
129
+ 11: sum -= a;
130
+
131
+ 12: break;
132
+
133
+ 13: case '*':
134
+
135
+ 14: sum *= a;
136
+
137
+ 15: break;
138
+
139
+ 16: case '/':
140
+
141
+ 17: sum /= a;
142
+
143
+ 18: break;
144
+
145
+ 19: }
146
+
147
+ 20: }
148
+
149
+ 21: printf("%d\n", sum);
150
+
151
+ ```
152
+
153
+ これに、"1[Enter]+[Enter]2[Enter]=[Enter]"を喰わせます。
154
+
155
+ 1:最初は標準入力は空なので入力待ち。"1[Enter]"を入力するのでsumに1を取り込みます。標準入力には\nが残っています。
156
+
157
+ 2:のwhile(true)は素通しで
158
+
159
+ 3:これまでの話で、cpには'\n'が入ります。標準入力は空になって
160
+
161
+ 4:ifの条件は偽で次へ
162
+
163
+ 5:ここでscanfは入力バッファが空なので入力待ちになります。ここに入ってくるデータは"+[Enter]"。"%d"は整数を要求します。'+'はもしかしたら整数の一部かもしれないので取り込みますが、次が'[Enter]'だと整数として解釈出来ないので、scanfは失敗。aの値は変更されないまま、また標準入力には"[Enter]"が入ってまま次に進みます。
164
+
165
+ 6:cpには'\n'が入ってますから、どのcaseラベルともマッチしません。
166
+
167
+ 20:switch文を抜けて、whileの終わりに到達。2:のwhileのところまで戻りましょう。
168
+
169
+ 3:標準入力の先頭は'[Enter]'ですから、cpに'\n'を取り込みます。
170
+
171
+ 4:cpは'\n'なので偽
172
+
173
+ 5:標準入力が空で入力待ち、"2[Enter]が入力されますので、aには2が入って標準入力には[Enter]が残ります。
174
+
175
+ 6:cpは'\n'なのでcaseにマッチなし
176
+
177
+ 20:while終わり、2:に戻って
178
+
179
+ 3:標準入力は'[Enter]'で'\n'をcpに取り込み
180
+
181
+ 4:ifの条件は偽で次へ
182
+
183
+ 5:標準入力は空なので入力待ち。"=[Enter]"が入力されますが、数値には変換不可で標準入力には"=[Enter]"が入った状態で次に
184
+
185
+ 6:cpは'\n'なのでマッチなし
186
+
187
+ 20:while終わり、2:に戻って
188
+
189
+ 3:標準入力の先頭は'='なので、cpに取り込みます。標準入力には"[Enter]"が残っています(もう関係ないけど)
190
+
191
+ 4:cpが'='なのでif文の判定式が真でbreak; 21:へ
192
+
193
+ 21:さて、sumは...最初に設定された1から変更なし。なので1を表示します。
194
+
195
+ 以上、終わり。