2011-12-19 84 views
2

讓我們從代碼中看到的問題:問題與switch語句

代碼1

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int a =1; 
    switch (a) 
    { 
     printf("This will never print\n"); 
    case 1: 
     printf(" 1"); 
     break; 
    default: 
     break; 
    } 
    return 0; 
} 

這裏printf()語句永遠不會執行 - 看http://codepad.org/PA1quYX3。但

代碼2

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    int a = 1; 
    switch (a) 
    { 
     int b; 
    case 1: 
     b = 34; 
     printf("%d", b); 
     break; 
    default: 
     break; 
    } 
    return 0; 
} 

這裏int b將被宣佈 - 見http://codepad.org/4E9Zuz1e

我不明白爲什麼在code1 printf()不執行,但在代碼2 int b即將執行。

爲什麼?

編輯: 我得到的INT B;是聲明,它是在編譯時分配內存,以便控制流是否到達那裏,否則該聲明將完成。

現在看到這個代碼

#include<stdio.h> 

int main() 
{ 
    if(1) 
    { 
    int a; 
    } 

a =1; 
return 0; 
} 

這裏INT一個是控制流路徑仍然還是這不會編譯......爲什麼?

+2

** [我的答案](http://stackoverflow.com/a/8535765/1090079)** to [當它的定義被繞過時如何使用變量?](http:// stackoverflow 。com/q/8535731/1090079)應該解釋發生了什麼 – 2011-12-19 05:04:42

+1

請注意,如果'b'的聲明是'int b = 31',則不能保證初始化會發生。 printf()和聲明之間的主要區別在於'printf()'語句是可執行的,而聲明不是。 – 2011-12-19 05:32:27

回答

7

認爲switch只是一個goto帶標籤。無論你在哪裏goto,只要變量聲明高於你使用它的地方,你就可以使用它。這部分是由於變量聲明是而不是這樣的可執行語句,它像表達式一樣得到「完成」。該交換機是非常接近等同於:

int a = 1; 

{ 
    if (a == 1) goto case1; 
    goto defaultcase; 

    int b; 

case1: 
    b = 34; 
    printf("%d", b); 
    goto end; 

defaultcase: 
    goto end; 

end: 
} 

return 0; 

而且goto■找無關的b範圍。

嘗試這樣做雖然:

switch (a) 
{ 
int b = 1; 
.... 

在這種情況下,即使b聲明,初始化將被跳過,因爲這是一個可執行語句既可以完成或沒有完成。如果你試圖這樣做,你的編譯器會警告你。

關於內部if(更新問題)的聲明:在這種情況下,具有a限定於if一個範圍。它在輸入範圍時創建,並在範圍結束時銷燬。

+0

現在看我的編輯 – 2011-12-19 06:39:37

+2

@ Mr.32在這種情況下,'a'作爲範圍限於'if'。它在輸入範圍時創建,並在範圍結束時銷燬。請注意,'switch'不會創建一個新的範圍,就像標籤和'goto'一樣。 – 2011-12-19 09:03:52

+1

@SethCarnegie:爲了反映問題的變化,這個(範圍/ if)不應該添加到答案中嗎? – 2011-12-19 09:26:45

2

因爲int b;是一個聲明,編譯器不會爲它生成代碼。

int a = 1; 

switch (a) { 

/* Instructions corresponding to the code here will not be executed */ 
/* printf("hi"); Instructions for such code will never be executed */ 
/* int b;  It is just a declaration. No executable code is generated for it*/ 

int b = 34;/*Replaced int b by int b = 34 now b will never be initialized to 34*/ 
case 1: 
    printf("%d",b);  /*you will get garbage value now*/ 
    break; 
default: 
    break; 
}