switch里面不能做什么?


C++課設的時候,室友喊我幫他看一下這個錯誤,具體的代碼不記得了,形式上是這樣的(其他的某些break就沒寫了):

<span style="font-size:14px;">switch(a)
{
	case 1:
	case 2: int a;scanf("%d",&a);cout<<a;break;
	...
	case n:
}</span>
  過不了編譯,為什么呢?剛開始我想是不是沒打{ }符號?但是我又想起來C/C++里面唯一不強制用{ }做代碼塊的就是switch里面的case! 網上搜了一下之后就知道這怎么解決了,這和作用域是有關系的!

  我們都知道{ }能把變量限制在里面,也就是說變量的生存期被強行固定在里面了,我們向外看一下,switch也是有括號的!那么在某一個case分支的聲明的變量算誰的呢?當然算switch的!照這么看,一個case的變量看似可以和其它case共享。但是這樣是有風險的,仔細想一想:我們從case1進去,假設case1里面有一個integer a=10,然后就break出去了,這樣沒有問題。但是假如我們從case5進去,遇到printf("%d",a)那這樣就出現了奇怪的狀況,printf不認識這個a了!它當然不認識,直接從case5進去,是「跳過」了case1的,關於a,它不知道。

  這是一種非常特殊的語法現象,緣由可以說是switch分支結構搞的鬼,可能具體的要看匯編來解釋,有時間我也會問一下計科的朋友。最后說一下這種問題怎么解決,很簡單:

<span style="font-size:14px;">switch(a)
{
	case 1:
	case 2: {int a;scanf("%d",&a);cout<<a;}break;
	...
	case n:
}</span>

把a的作用域限制在某一個case分支里面了,用完馬上丟掉。記住break不要放到{ }里面來以免不必要的錯誤,如果確實想在各個case之間進行傳遞,還是想辦法用函數吧。


記住{ }里面就是屬於自己的私有世界。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com