2010-12-01 289 views
-2
void display() 
{ 
    printf("every thing is ok"); 
} 
void main() 
{ 
    int ch; 
    while(1) 
    { 
     printf("enter your choice"); 
     scanf("%d",&ch); 
     switch(ch) 

     { 
      case 1: clrscr();printf("when choice is one every thing is fine"); 
        display(); 
        break; 
      case 2: clrscr();printf("when chice is two its confusing"); 
        display(); 
        break; 
      case 3: exit(0); 
      default: printf("enter choice as 1 or 2 or to exit enter 3"); 
     } 
    } 
} 

當我跟蹤這個C程序並輸入選項2時,它調用case 1模塊的顯示功能。我不明白。請回答一個解釋。我很困惑。c switch語句

+0

對我來說沒問題。當你輸入1時會發生什麼?你是什​​麼意思「它稱爲情況1塊的顯示功能」? Display()在您提供的代碼中從案例1和案例2中調用 – 2010-12-01 18:51:18

+1

您的預期輸出是什麼?您看到了什麼? – casablanca 2010-12-01 18:51:19

回答

4

編譯器可能重新安排你的源語句倒塌其basic blocks。然後調試器在兩種情況下將對display()的調用與匹配的源代碼行號碼進行匹配。啓用優化時通常會這樣。

0

你的編譯器可能會做一些花哨的優化也看到了兩種不同的情況相同的函數調用時。檢查你的編譯器標誌,並且/或者向display()添加一些不同的參數來查看它是否真正被你調用。

0

編譯器轉換代碼以使其更高效。當您嘗試調試時,這可能會造成混淆,因此您應該關閉優化(如何執行此操作取決於您的編譯器或IDE)。

如果您在代碼中發現後printf陳述case 1case 2是相同的,那麼你就應該意識到這可能是更有效的,只是有一個呼叫display - 的情況下,一個只會跳轉到最後另一個案例的聲明和程序的結果是一樣的。

儘管如此,你可以做得更多。由於case 1case 2之間的唯一真正區別是打印的字符串,除了一小段代碼設置指向將要打印的字符串的指針外,您只能擁有整個代碼塊的一個副本。