第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么不能在開(kāi)關(guān)語(yǔ)句中聲明變量?

為什么不能在開(kāi)關(guān)語(yǔ)句中聲明變量?

C++ C
慕斯709654 2019-05-31 17:09:15
為什么不能在開(kāi)關(guān)語(yǔ)句中聲明變量?我一直在想,為什么不能在開(kāi)關(guān)語(yǔ)句中的CASE標(biāo)簽之后聲明變量呢?在C+中,您可以在任何地方聲明變量(并且聲明它們接近第一次使用顯然是件好事),但是下面的內(nèi)容仍然不能工作:switch (val)  {  case VAL:     // This won't work   int newVal = 42;     break;case ANOTHER_VAL:     ...   break;}以上給出了以下錯(cuò)誤(MSC):“newVal”的初始化由“case”標(biāo)簽跳過(guò)在其他語(yǔ)言中,這似乎也是一個(gè)限制。為何會(huì)出現(xiàn)這樣的問(wèn)題呢?
查看完整描述

3 回答

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

Case陳述僅限于標(biāo)簽..這意味著編譯器將解釋為直接跳轉(zhuǎn)到標(biāo)簽。在C+中,這里的問(wèn)題是范圍問(wèn)題之一。您的花括號(hào)將作用域定義為switch聲明。這意味著您將有一個(gè)范圍,在該范圍內(nèi),將在代碼中執(zhí)行跳轉(zhuǎn),跳過(guò)初始化。正確的處理方法是定義一個(gè)特定于case語(yǔ)句,并在其中定義變量。

switch (val){   case VAL:  {
  // This will work
  int newVal = 42;  
  break;}case ANOTHER_VAL:  ...break;}


查看完整回答
反對(duì) 回復(fù) 2019-05-31
?
30秒到達(dá)戰(zhàn)場(chǎng)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

這個(gè)問(wèn)題最初被標(biāo)記為[C]和[C+]。原來(lái)的代碼在C和C+中都是無(wú)效的,但是由于完全不同的原因。我相信這個(gè)重要的細(xì)節(jié)被現(xiàn)有的答案所遺漏(或混淆)。

  • 在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;}

加一個(gè)額外的{}塊修復(fù)了C+和C兩個(gè)問(wèn)題,盡管這些問(wèn)題恰好不同。在C+方面,它限制了newVal,確保case ANOTHER_VAL:不再跳入該范圍,從而消除了C+問(wèn)題。在C邊那額外的{}引入復(fù)合語(yǔ)句,從而使case VAL:標(biāo)簽可應(yīng)用于語(yǔ)句,從而消除了C問(wèn)題。

  • 在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ú)效的。


查看完整回答
反對(duì) 回復(fù) 2019-05-31
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

好的。嚴(yán)格地澄清這一點(diǎn)與聲明無(wú)關(guān)。它只涉及“跳過(guò)初始化”(ISO C+‘03 6.7/3)

這里的許多帖子提到,跳過(guò)聲明可能會(huì)導(dǎo)致變量“未聲明”。這不是真的。POD對(duì)象可以在沒(méi)有初始化器的情況下被聲明,但是它有一個(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;}

如果對(duì)象是非POD或聚合,編譯器將隱式添加初始化器,因此不可能跳過(guò)這樣的聲明:

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;}

此限制不限于開(kāi)關(guān)語(yǔ)句。使用“goto”跳過(guò)初始化也是一個(gè)錯(cuò)誤:

goto LABEL;    // Error jumping over initializationint j = 0; LABEL:
  ;

有一點(diǎn)需要注意的是,這是C+和C之間的區(qū)別,在C中,跳過(guò)初始化并不是一個(gè)錯(cuò)誤。

正如其他人所提到的,解決方案是添加一個(gè)嵌套塊,以便變量的生存期僅限于個(gè)別的CASE標(biāo)簽。


查看完整回答
反對(duì) 回復(fù) 2019-05-31
  • 3 回答
  • 0 關(guān)注
  • 825 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)