2011-03-21 89 views
1

在該循環中(假設amount是2時),而不是打印:C++ for循環和switch語句的邏輯錯誤

1. [op1] 
2. [op2] 

它打印:

1. [op1] 
2. [op2] 
3. [op3] 
4. [op4] 
5. [op5] 

爲什麼呢?我怎樣才能解決這個問題?

for(int i=1;i<=amount;i++){ 
      //string s; 
      switch(i){ 
      case 1: 
       cout << i << ". " << op1 << endl; 
       //s = op1; 
      case 2: 
       cout << i << ". " << op2 << endl; 
       //s = op2; 
      case 3: 
       cout << i << ". " << op3 << endl; 
       //s = op3; 
      case 4: 
       cout << i << ". " << op4 << endl; 
       //s = op4; 
      case 5: 
       cout << i << ". " << op5 << endl; 
       //s = op5; 
      } 
      //cout << i << ". " << s << endl; 
     } 
+0

認爲開關是一個榮耀的'goto':它跳轉到一個案例,只是從那裏去,好像案件是一個標籤和標籤由'switch'表達式選擇,要停止執行,在case結尾使用'break;' – GManNickG 2011-03-21 19:58:54

+2

實際上你應該獲得'[op1] [op2] [op3] [op4] [op5] [op2] 【O p3] [op4] [op5]',對吧? – Vlad 2011-03-21 19:59:43

+0

@Vlad - 是的,這是OP應該得到的。 – 2011-03-21 20:09:53

回答

10

您需要使用break;或switch()將具有所謂的「貫穿性」。

(這意味着它執行你的情況:然後繼續之後發生的任何事情,包括其他case語句中的代碼)。

+0

啊,我忘記了我的switch語句中的一箇中斷,謝謝。 – pighead10 2011-03-21 19:59:26

2

你需要把

break; 

在每一種情況下結束。否則,它會轉到case1,然後繼續到選擇的結尾。 (case1,2,3,4,5)

2

您必須在每個case:部分的末尾插入break;-結束語。

這是因爲switch() {}僅僅是一個goto的重新配製,案件只是標籤,不是真正的塊(這就是爲什麼他們使用的標籤語法,而不是一個塊的語法像case ... { }

1

掛上了「打破「的聲明,否則控制流將直接通過