記報錯 "error: jump to case label [-fpermissive]" 局部變量的作用域問題

文章目錄

❯ 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章