3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
Case
switch
case
switch (val){ case VAL: { // This will work int newVal = 42; break;}case ANOTHER_VAL: ...break;}

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
在C+中,此代碼無(wú)效,因?yàn)?/trans> case ANOTHER_VAL:
標(biāo)簽跳入變量的范圍。 newVal
繞過(guò)它的初始化。跳過(guò)本地對(duì)象的初始化在C+中是非法的。大多數(shù)答案都正確地處理了這個(gè)問(wèn)題的這一面。 但是,在C語(yǔ)言中,繞過(guò)變量初始化并不是一個(gè)錯(cuò)誤。在初始化時(shí)跳入變量的范圍在C中是合法的。它只是意味著變量沒(méi)有初始化。由于完全不同的原因,原始代碼沒(méi)有在C中編譯。標(biāo)簽 case VAL:
在原始代碼中,變量的聲明附加在一起。 newVal
..在C語(yǔ)言中,聲明不是語(yǔ)句。他們不能被貼上標(biāo)簽。當(dāng)這段代碼被解釋為C代碼時(shí),這就是導(dǎo)致錯(cuò)誤的原因。 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情況下,這個(gè)問(wèn)題可以很容易地解決,而不需要 {}
..之后添加一個(gè)空語(yǔ)句即可。 case VAL:
標(biāo)簽和代碼將變得有效。 switch (val) { case VAL:; /* Now it works in C! */ int newVal = 42; break;case ANOTHER_VAL: ... break;}
注意,盡管從C的角度來(lái)看,它現(xiàn)在是有效的,但從C+的角度來(lái)看,它仍然是無(wú)效的。 對(duì)稱(chēng)地說(shuō),在C+情況下,這個(gè)問(wèn)題可以很容易地解決,而不需要 {}
..只要從變量聲明中刪除初始化程序,代碼就會(huì)生效。 switch (val) { case VAL: int newVal; newVal = 42; break;case ANOTHER_VAL: /* Now it works in C++! */ ... break;}
注意,盡管從C+的角度來(lái)看,它現(xiàn)在是有效的,但從C的角度來(lái)看,它仍然是無(wú)效的。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
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 關(guān)注
- 825 瀏覽
添加回答
舉報(bào)