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ảo Ngọc viết 20:57 ngày 30/09/2018

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.

To Duy Nghia viết 20:53 ngày 30/09/2018

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

bphvcg viết 20:47 ngày 30/09/2018

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

Võ Hoài Sơn viết 20:52 ngày 30/09/2018

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

To Duy Nghia viết 20:50 ngày 30/09/2018

đồ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

Pham Van Hai viết 20:48 ngày 30/09/2018

Ở đâ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

To Duy Nghia viết 20:48 ngày 30/09/2018

yes, cảm ơn cậu nhé!

Bài liên quan
0