在 switch 中,如果绕过一个 case 内的本地变量初始化,为什么会出错!

kwib799 2004-07-06 09:05:07
//例如:
#include<iostream>
#include<ctype.h>
using namespace std;
int main()
{
char ch;
int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0,
consonantCnt = 0;
while ( cin >> ch )
switch ( ch )
{
case 'a': case 'A':
++aCnt;
break;
case 'e': case 'E':
++eCnt;
break;
case 'i': case 'I':
++iCnt;
break;
case 'o': case 'O':
++oCnt;
break;
case 'u': case 'U':
int i=7;
++uCnt;
break;
default:
if ( isalpha( ch ))
++consonantCnt;
break;
}
cout <<"Number of vowel a: \t" <<aCnt <<'\n'
<<"Number of vowel e: \t" <<eCnt <<'\n'
<<"Number of vowel i: \t"<<iCnt <<'\n'
<<"Number of vowel o: \t" <<oCnt <<'\n'
<<"Number of vowel u: \t" <<uCnt <<'\n'
<<"Number of consonants: \t" <<consonantCnt <<'\n';
}
...全文
370 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
peter9606 2004-07-15
  • 打赏
  • 举报
回复
To : steedhorse(晨星)

好像还是没有说清楚呀
晨星 2004-07-15
  • 打赏
  • 举报
回复
前面好像说的不对,关键跳过的不是定义,而使初始化。
像int这种内建类型,没有什么构造函数可言。所以先定义,后面赋值应该没问题。但用户自定义类型就不行了,因为定义一个对象就意味着初始化。

int i = 7;是定义加初始化
而int i;只是定义,后面的i=7;则是另一条不相关的赋值语句了。
peter9606 2004-07-15
  • 打赏
  • 举报
回复
當類聲明時,i是沒有被初始化的,但在類析構時編譯器卻認爲你肯定初始化了,而將其析構,這樣産生不可預料錯誤了,況且一個變量只要在其作用域內就必須保證它被初始化了,可以改成這樣子:
int i;
i=7
~~~~~~~~~~~~~~~~~~~~~~~~~~
明白了~
zhengwei1984222 2004-07-15
  • 打赏
  • 举报
回复
对啊“int i; i=7;分成2条语句就没有错误。为什么?”
我们等着呢!
高手来~
cxjddd 2004-07-07
  • 打赏
  • 举报
回复
学习了:)
peter9606 2004-07-07
  • 打赏
  • 举报
回复
楼上的能不能讲得更清楚一点?
expert2000 2004-07-07
  • 打赏
  • 举报
回复
int i; i=7;分成2条语句就没有错误。为什么?
expert2000 2004-07-06
  • 打赏
  • 举报
回复
int i; i=7;分成2条语句就没有错误。为什么?
peter9606 2004-07-06
  • 打赏
  • 举报
回复
是的 就是这个意思!
kwib799 2004-07-06
  • 打赏
  • 举报
回复
to peter9606(裴裴)
你的意思是说,如果我在不执行的 case 1 中定义变量并在后面的case/default 中使用到这个变量就会不安全,那如果我加上 {} 之后变量的作用域就只在 case 1 中,而不至于污染整个的 switch 作用域?
peter9606 2004-07-06
  • 打赏
  • 举报
回复
道理 steedhorse(晨星) 已经说得很明白了

你定义的int i 的作用域是在整个的 switch{}中,也就是说你在case中定义的变量在后面的case/default中是可见的。
但是编译器会发现你是在某个case下定义的,如果你这个case 还有别的case 或者default那么编译器就认为它是不安全的(很可能你会在某个其他的case/default中使用到这个变量),但是如果你的程序跳出定义变量的case语句 ,那么错误就是在所难免的了,所以编译器会报错的。

这算是很简单的语法分析了吧。
我是这样理解的,还请大牛们指点!
kwib799 2004-07-06
  • 打赏
  • 举报
回复
同意 peter9606(裴裴)'s statement!
peter9606 2004-07-06
  • 打赏
  • 举报
回复
To Edelweissobject(青山绿水)
case后不需要加{}的!
QQQiang 2004-07-06
  • 打赏
  • 举报
回复
當類聲明時,i是沒有被初始化的,但在類析構時編譯器卻認爲你肯定初始化了,而將其析構,這樣産生不可預料錯誤了,況且一個變量只要在其作用域內就必須保證它被初始化了,可以改成這樣子:
int i;
i=7
kwib799 2004-07-06
  • 打赏
  • 举报
回复
还是不太明白,如果跳过 "int i=7;" 的话,为什么会出错!
那位能不能给江将原理!
谢谢了!
tsingien 2004-07-06
  • 打赏
  • 举报
回复
c++ Primer 3nd里面有解释。我觉得变量的作用域是最里面包含它的大括号,而case 'u' 或者'U'的情况并不一定会被执行,那么变量可能未被初始化,这样在其他的case或者default中如果引用的话……,总觉得不是回事
Edelweissobject 2004-07-06
  • 打赏
  • 举报
回复
To kwib799(亏拨) case 语句 后面如果要跟多个执行语句必须用{}再break;这个跟C#语法一样。其中{}中可以执行非常复杂的过程。
BluntBlade 2004-07-06
  • 打赏
  • 举报
回复
满纸荒唐言,一把辛酸泪……
0uhuang 2004-07-06
  • 打赏
  • 举报
回复
关注ing
晨星 2004-07-06
  • 打赏
  • 举报
回复
把变量声明放到一对{}中是可以的,因为那样变量的作用域就那对大括号中,但直接放在switch的大括号内,却置于某个case之后是不可以的,因为那样意味这有某个变量,其作用域直接在swtich的大括号内,它的作用域本身并没有被跳过(swtich语句并没有被跳过),但它在其作用域内却未必被定义,这显然是荒唐的。
加载更多回复(7)

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧