找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1987|回复: 7

为什么类对象定义放在条件块中会发生编译错误?

[复制链接]
发表于 2009-11-3 23:43:07 | 显示全部楼层 |阅读模式 IP:江苏扬州
有这样一段代码:

class NoJump
{
public:
NoJump() {}
};
void FunNoJump(int i)
{
switch (i)
{
case 1:
NoJump aa; //编译出错提示: error C2360: initialization of 'aa' is skipped by 'case' label, see declaration of 'aa'
break;
case 2:
NoJump bb; //编译出错提示:error C2360: initialization of 'bb' is skipped by 'case' label, see declaration of 'bb'
break;
case 3:
break;
}
}

修改后:
void FunNoJump(int i)
{
switch (i)
{
case 1:
{//加上括号
NoJump aa;
}//加上括号
break;
case 2:
{//加上括号
NoJump bb;
}//加上括号
break;
case 3:
break;
}
}

编译通过,没有想明白为什么。。。。
发表于 2009-11-3 23:43:09 | 显示全部楼层 IP:江苏扬州
在C++编程思想一书中有这样的描述,但还是没有真正理解。。。
附件: 只有本站会员才能下载或查看附件,请您 登录 或 注册
回复

使用道具 举报

发表于 2009-11-3 23:43:11 | 显示全部楼层 IP:江苏扬州
switch (i)
{
case 1:
NoJump aa; break;
case 2:
NoJump bb; break;
case 3:
break;
}
假如i = 2;则执行case 2的语句,从语法上讲case 2可以执行aa这个变量,但代码执行时却又没有执行 NoJump aa; 这一句,这是矛盾的。
所以必须加上{}限制变量的作用域
回复

使用道具 举报

发表于 2009-11-3 23:43:25 | 显示全部楼层 IP:江苏扬州
以下是引用wangxiang在2006-9-6 20:39:57的发言:

switch (i)
{
case 1:
NoJump aa; break;
case 2:
NoJump bb; break;
case 3:
break;
}
假如i = 2;则执行case 2的语句,从语法上讲case 2可以执行aa这个变量,但代码执行时却又没有执行 NoJump aa; 这一句,这是矛盾的。
所以必须加上{}限制变量的作用域
非常感谢wangxiang的解释,但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?
回复

使用道具 举报

发表于 2009-11-3 23:43:26 | 显示全部楼层 IP:江苏扬州
但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?
意思是说case上面的这个aa已经声明了,根据作用域的规定,aa已经出现了,(都在switch这一个块中)所以下面的case就可以对aa进行操作,但是,当操作的时候又会发现,他没有定义。
因为没有进入case 1而是直接进了case 2,这样就矛盾了,加个{}规定aa的域。就不会产生矛盾了
回复

使用道具 举报

发表于 2009-11-3 23:43:27 | 显示全部楼层 IP:江苏扬州
谢谢wfpb版主的点拨,谢谢两位的帮助,现在明白了.:)
回复

使用道具 举报

发表于 2009-11-3 23:43:28 | 显示全部楼层 IP:江苏扬州
以下是引用wfpb在2006-9-7 11:08:42的发言:
但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?

意思是说case上面的这个aa已经声明了,根据作用域的规定,aa已经出现了,(都在switch这一个块中)所以下面的case就可以对aa进行操作,但是,当操作的时候又会发现,他没有定义。
因为没有进入case 1而是直接进了case 2,这样就矛盾了,加个{}规定aa的域。就不会产生矛盾了
BZ 我不太明白 这句话是什么意思啊。
比如我的代码是:
#include <iostream.h>
int main()
{int i=2;
switch(i)
{
case 1: cout<<"aa"<<endl;
case 2: cout<<"bb"<<endl;
case 3: cout<<"cc"<<endl;
}
return 0;
}
而我执行的只是后两句啊“cout<<"2"<<endl; cout<<"3"<<endl;”并没有执行cout<<"1"<<endl;
为什么说:根据作用域的规定,aa已经出现了,作用域是如何规定的啊?
回复

使用道具 举报

发表于 2009-11-3 23:43:29 | 显示全部楼层 IP:江苏扬州
变量有局部和全局之分。
全局就不用说了
局部就是在{}之间的。
当然,如果在某些时候只有一个语句时也是局部。比如if(i==0)int a;
那只是因为{}被省略了。

所以,{}是决定她里面声明的变量的生命周期。
由于在前面的case语句中已经有了aa这个变量出现了,按照{}的规定,aa就应该在下面的case操作中可以用到了,但是实际上NoJump aa;或许没有执行,那么就会产生矛盾,所以加个{}就规定了,aa只是在第一个case中的生命周期。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 19:36 , Processed in 0.145384 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表