3 回答

TA貢獻1802條經驗 獲得超6個贊
Case
switch
case
switch (val){ case VAL: { // This will work int newVal = 42; break;}case ANOTHER_VAL: ...break;}

TA貢獻1828條經驗 獲得超6個贊
在C+中,此代碼無效,因為 case ANOTHER_VAL:
標簽跳入變量的范圍。 newVal
繞過它的初始化。跳過本地對象的初始化在C+中是非法的。大多數答案都正確地處理了這個問題的這一面。 但是,在C語言中,繞過變量初始化并不是一個錯誤。在初始化時跳入變量的范圍在C中是合法的。它只是意味著變量沒有初始化。由于完全不同的原因,原始代碼沒有在C中編譯。標簽 case VAL:
在原始代碼中,變量的聲明附加在一起。 newVal
..在C語言中,聲明不是語句。他們不能被貼上標簽。當這段代碼被解釋為C代碼時,這就是導致錯誤的原因。 switch (val) { case VAL: /* <- C error is here */ int newVal = 42; break;case ANOTHER_VAL: /* <- C++ error is here */ ... break;}
{}
newVal
case ANOTHER_VAL:
{}
case VAL:
在C情況下,這個問題可以很容易地解決,而不需要 {}
..之后添加一個空語句即可。 case VAL:
標簽和代碼將變得有效。 switch (val) { case VAL:; /* Now it works in C! */ int newVal = 42; break;case ANOTHER_VAL: ... break;}
注意,盡管從C的角度來看,它現在是有效的,但從C+的角度來看,它仍然是無效的。 對稱地說,在C+情況下,這個問題可以很容易地解決,而不需要 {}
..只要從變量聲明中刪除初始化程序,代碼就會生效。 switch (val) { case VAL: int newVal; newVal = 42; break;case ANOTHER_VAL: /* Now it works in C++! */ ... break;}
注意,盡管從C+的角度來看,它現在是有效的,但從C的角度來看,它仍然是無效的。

TA貢獻1786條經驗 獲得超11個贊
switch (i){ case 0: int j; // 'j' has indeterminate value j = 0; // 'j' initialized to 0, but this statement // is jumped when 'i == 1' break; case 1: ++j; // 'j' is in scope here - but it has an indeterminate value break;}
class A {public: A ();};switch (i) // Error - jumping over initialization of 'A'{ case 0: A j; // Compiler implicitly calls default constructor break; case 1: break;}
goto LABEL; // Error jumping over initializationint j = 0; LABEL: ;
- 3 回答
- 0 關注
- 824 瀏覽
添加回答
舉報