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 << "\nnot 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?

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. :blush: 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 :smile:

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 :smiley:

đồ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ểu int):

  • Bạn nhập một số nguyên khác 1 --> khối lệnh default sẽ được thực hiện và nó sẽ yêu cầu nhập lại n --> đúng theo mong muốn
  • Bạn nhập ký tự (ví dụ a, b, c) --> std::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é!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?