3 回答
TA貢獻1802條經驗 獲得超6個贊
Caseswitchcase
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;}
{}newValcase 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 關注
- 839 瀏覽
添加回答
舉報
