回答編集履歴
1
追記
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
|
+
以上、終わり。
|