Thắc mắc về switch

Em có dòng code:

#include <iostream>
using namespace std;
int main(){
	int nIn;
	cout << "Enter your month of birth" << endl;
	cin >> nIn;
	switch (nIn)
	{
	case 1:
		int trashnumber;
	case 2:
		trashnumber = 3;
	case 3:
		cout << trashnumber<<endl;
		break;
	}
	system("pause");
	return 0;
}

em Buid nó k có lỗi, khi chạy em chọn trashnumber là 2 thì nó vẫn cout ra 3, em nghĩ khi nhấn 2 thì trashnumber chưa được cung cấp ô nhớ, vậy khi xuất nó lấy giá trị của ai vậy mọi người.

1 Like

Là do cách làm việc của thằng switch. :slight_smile:

Nếu mình có một switch như thế này:

switch(a) {
  case b:
    std::cout << "case a = b is true\n";
  case c:
    int e = 1001; // declare variable e
    std::cout << "case a = c is true\n"; 
    break;
  case d:
    std::cout << "case a = d is true\n";
  default:
   std::cout << "this is default case\n";
}

Thì nó sẽ tương đương với đoạn code sau:

do {
  if (a == b) {
    std::cout << "case a = b is true\n";
  }
  int e = 1001; // this declare is brought out of if block
  if (a == c) {
    std::cout << "case a = c is true\n";
    break; // if this case is true, do..while loop will be breaked
  }
  if (a == d) {
    std::cout << "case a = d is true\n";
  }
  std::cout << "this is default case\n"; // default case
} while(0);

Vậy là bạn tự trả lời được câu hỏi này rồi nhỉ. :slight_smile:


P/S: Bonus thêm, nếu bọc đoạn khai báo kia vô {} thì compiler sẽ báo lỗi, chắc bạn cũng tự giải thích được luôn nhỉ. :slight_smile:

8 Likes

Minh có một thắc mắc là phép tính toán như e+=2;
thì phép toán đó có trong if không hay là ngoài if ạ ?

Theo bạn thì nó ở trong hay ngoài. :slight_smile:

P/s cái default case kia hơi sai sai, mà mình lười sửa. :v :v :v

3 Likes

Là ngoài ạ ? :sweat_smile: :sweat_smile:

Chắc default là không làm gì cả nên không ổn :smiley: ít ra cũng báo sai.

3 Likes

Ở ngoài nghĩa là e += 2 bất kể if đúng hay sai??? :V :V :V

2 Likes

Cảm ơn bạn. Vậy là mỗi khai báo sẽ nằm ngoài :sweat_smile: . Nhưng mà cho mình hỏi là khi k có break thì các if sẽ như thế nào v ạ

Khi không có break; thì lệnh sẽ đi thẳng xuống case tiếp theo (fall-through).

5 Likes

Vâng. Nhưng mình có thể biểu diễn fall-through qua các lệnh if đc k a?

Có hai cách: một là goto (jumping :smiley: ) vì như vậy mới nhảy ra nhảy vào các block, hai là dùng hàm với lời gọi đệ quy.

Nói chung không nên thử.

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