文章目錄
❯ cd "f:\myCPlusPlusCode\DataStructure\Stack\" ; if ($?) { g++ -fexec-charset=GBK bracketMatch.cpp -o bracketMatch.exe } ; if ($?) { .\bracketMatch.exe }
bracketMatch.cpp: In function 'int bracketMatch(std::__cxx11::string)':
bracketMatch.cpp:41:13: error: jump to case label [-fpermissive]
default: break;
^~~~~~~
bracketMatch.cpp:35:22: note: crosses initialization of 'char ch'
char ch = S.top();
^~
問題代碼如下
switch ( e ) {
case '{':
case '[':
case '(':
S.push(e);
break;
case '}':
case ']':
case ')':
if ( S.empty() ) return RIGHT_UNNECESSARY;
char ch = S.top();
if ( ch=='{'&&e=='}' || ch=='['&&e==']' || ch=='('&&e==')' ) {
S.pop();
} else {
return TYPE_ERROR;
}
default: break;
}
很明顯報錯說 跳過了變量ch的初始化, 這是爲什麼呢?
是因爲每個變量都有它的作用域, 從聲明開始到 } 結束, 這是一個生命週期,
但是再這個 switch循環裏, 比如說在 e==’} 的時候, 聲明瞭一個ch, 又到了 e==’]’ 的時候, 又要聲明一個ch, , 由於一個變量的生命週期是到 循環的 } 時才結束, ch變量並沒有被銷燬, 是存在的, 所以就是這裏出的問題
解決辦法有兩個, 一個是加一對 {} 來限制局部變量的作用域, 再者就是將生命的位置提前到括號前來提升它的優先級
switch ( e ) {
case '{':
case '[':
case '(':
S.push(e);
break;
case '}':
case ']':
case ')': { // 加花括號是爲了限制 變量ch 的作用域
if ( S.empty() ) return RIGHT_UNNECESSARY;
char ch = S.top();
if ( ch=='{'&&e=='}' || ch=='['&&e==']' || ch=='('&&e==')' ) {
S.pop();
} else {
return TYPE_ERROR;
}
}
default: break;
}