2016-11-23 53 views
1
#include<bits/stdc++.h> 
using namespace std; 

void show(int errorCause) 
{ 
    switch(errorCause) 
    { 
     case 1: 
     { 
      cout<<"in 1\n"; 
      break; 
     } 

     case 2: break; 

     case 3: 
     { 
      cout<<"in 3\n"; 
      break; 

      case 4: 
      { 
       cout<<"in 4\n"; 
       case 5: cout<<"in 5\n"; 
        break; 
      } 
     } 
     break; 

     default: 
     { 
      cout<<"in deafult\n"; 
      break; 
     } 
    } 
    return; 
} 

int main() 
{ 
    show(5); 
    return 0; 
} 

我用這個代碼示例,我不能其flow.According弄清楚對我來說,應具備默認狀態爲errorCause不匹配任何東西,但它的輸出是:這個開關塊如何執行?

in 5 

我不明白爲什麼它不會默認狀態?

這裏是我的構建環境的詳細信息:

編譯: G ++版本4.8.4(Ubuntu的4.8.4-2ubuntu1〜14.04.3)

系統: 的Ubuntu 14.04(64位)

+0

請設置您的代碼的格式...如果我想像編譯器,我會拒絕閱讀和解析這段代碼。 –

+0

當試圖理解代碼流時,調試器是完美的 - 您可以逐步完成程序。 –

回答

4

你傳5,爲什麼switch語句不能進入'case 5'?

要說清楚:在開關塊內部移除所有這些大括號,它們都不是必需的。重新對齊和格式化代碼,那麼它應該很清楚。

+0

如果OP知道使用什麼範圍,大括號可以是正確的...... – LPs

+0

當然,但在這裏他們只是混淆...... – Rene

+0

事情是,如果代碼格式正確,你會看到是什麼導致OP混淆 - 一些'case'語句在大括號的不同級別內。但它實際上是允許的。 – axalis

1

首先,不要編寫那樣的代碼。 <克>

其次,它得到case 5:的原因很簡單,有switch語句內case 5:。它嵌套在兩層花括號內並不重要;它只是代碼跳轉到的標籤。它不必位於switch語句的外層。

+0

對不起,新的代碼.. – adarsh

0

這是因爲實際上switch聲明評估是「放寬」的,所以大括號在那裏並不重要。只有case很重要,但是您可以跳到case(或甚至到循環的中間,請參閱Duff's device)的範圍中間。

2

case/default標籤爲switch語句可能是switch語句中任何地方,除非嵌套switch語句中。

這種用法的一個著名的例子是用於Duff's device展開循環:

void copy(unsigned char *to, const unsigned char *from, size_t count) 
{ 
    size_t n; 

    if (!count) 
     return; 

    n = (count + 7)/8; 
    switch (count % 8) { 
    case 0: 
     do { 
      *to++ = *from++; 
    case 1: 
      *to++ = *from++; 
    case 2: 
      *to++ = *from++; 
    case 3: 
      *to++ = *from++; 
    case 4: 
      *to++ = *from++; 
    case 5: 
      *to++ = *from++; 
    case 6: 
      *to++ = *from++; 
    case 7: 
      *to++ = *from++; 
    case 1: 
     } while (--n > 0); 
    } 
} 

(改編自原)。乍一看,這沒有任何意義(如果你允許編譯器爲你展開循環,這有點多餘),但它說明case標籤可以放置在你喜歡的位置switch聲明。

0

因爲您傳遞的值是5,與切換案例參數完全匹配。

情況5:cout < <「in 5 \ n」; 休息;

,如果你想獲得默認的說法然後修改的主要功能如下所示:

int main() 
{ 
    show(6); 
    return 0; 
} 

希望這會有所幫助。