30/09/2018, 18:42
Về câu lệnh switch()
#include <iostream>
int main(){
int n;
bool ok;
while(!ok){
ok = true;
std::cin >> n;
switch(n) {
case 1: std::cout << "ok";
break;
default: std::cout << "
not ok"; ok = false;
break;
}
}
}
Với đoạn code này, tại sao khi nhập 1 kí tự ko phải số thì nó thực hiện cái default hoài không nghỉ vậy anh?
Bài liên quan
theo mình nếu n=1 thì nó sẽ chạy dòng code của case 1. còn nếu giá trị n là khác 1 nó sẽ chạy vào default. do đó khi bạn nhập một ký tự sẽ được chuyển sang kiểu int nếu khác 1 nó sẽ chạy default.
như cậu nói thì nó chỉ chạy 1 lần, rồi nhập lai chứ.
nhưng ở đấy nó chạy mãi thôi. không cho mình nhập lai
Chạy mãi là do set đkien !ok kìa bạn vì default ok=false ktra sai chạy… chạy…chạy
Việc bạn nhập 1 kí tự không phải số nên nó sẽ rơi vào trường hợp default của switch
Nên nhớ 1 điều, 1 kí tự bất kì cũng có thể được biểu diễn dưới dạng số (giống như kiểu char) nên dù bạn nhập mấy kí tự latin hay đặc biệt thì nó cũng quy về 1 con số => vào default
đồng ý chạy mãi do cái !ok, nhưng tại sao từ vòng lặp thứ 2 trở đi, dòng std::cin >> n bị bỏ qua
Ở đây có hai trường hợp vì
n
là số nguyên (kiểuint
):default
sẽ được thực hiện và nó sẽ yêu cầu nhập lạin
--> đúng theo mong muốnstd::cin
sẽ vào ‘trạng thái lỗi’ (failed state) vàreturn
ngay lập tức mà không làm gì, và vòng lặp của bạn sẽ bị lặp vô hạn. (mình chỉ dịch lại thôi).Bạn tham khảo thêm ở đây, chọn câu hỏi
Why does my program go into an infinite loop when someone enters an invalid input character?
, để biết thêm chi tiết.https://isocpp.org/wiki/faq/input-output#stream-input-failure
yes, cảm ơn cậu nhé!