记报错 "error: jump to case label [-fpermissive]" 局部变量的作用域问题
程序员文章站
2022-07-03 20:49:37
...
文章目录
❯ 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;
}
上一篇: 数学思想方法揭秘-1(原创)