为什么在switch中定义变量,会有警告?

cy010510630 2010-07-03 02:38:44
    switch (i)
{
case 1:
cout << "i is equal to 1" << endl;
break;
case 2:
cout << "i is equal to 2" << endl;
break;
case 3:

cout << "i is equal to 3" << endl;
int j = i + 1;
cout << "j = " << j;
break;

default:
cout << "i is not equal to 1, 2, or 3." << endl;
break;
}


变量在最近的一个{}中有效,那么上面这样做没有什么不合适的啊?
我就是想让一个变量在switch中有效,在switch后无效。
为什么非要在case3之间再加个{}警告才会消失?
...全文
248 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy010510630 2010-07-05
  • 打赏
  • 举报
回复
感谢各位回答。我在理解理解。
结账
yhp1888 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liweisdut 的回复:]
编译器把你的一个case当成一块,所以若是在其中有变量定义的话会给出警告:本变量只在本case中可用
[/Quote]

[Quote=引用 8 楼 jiakai1000 的回复:]
加了{}表示:只有当程序运行到这个case了,才会从栈上申请局部变量的空间并初始化,运行不到就不分配空间,避免浪费
[/Quote]

楼上正确。

其实楼主只要记住,这样做行不通,那样做行得通,大脑再想一下,就行了。

有警告就是表示有问题。

liutengfeigo 2010-07-04
  • 打赏
  • 举报
回复
在switch中定义变量本来就不是一个好做法
花熊 2010-07-04
  • 打赏
  • 举报
回复
int j = i + 1;这有问题,把int j提到最前面定义,不要在case中定义
jijun1018 2010-07-04
  • 打赏
  • 举报
回复
主要是定义变量内存的关系,不过不用{}括起来,编译器不能确定程序员所认为的变量的生存周期,没办法自动分配和销毁内存,填上括号就等于给出了这个范围。
schlafenhamster 2010-07-04
  • 打赏
  • 举报
回复
C和C++不同,C要求先定义,C++是随用随定义。所以会有以上问题。除了加{},你也可以把变量放switch前。
Eleven 2010-07-04
  • 打赏
  • 举报
回复
加括弧即可。。。
宝批龙1892 2010-07-04
  • 打赏
  • 举报
回复
switch中不能定义变量,除非有大括号括起来
jiakai1000 2010-07-03
  • 打赏
  • 举报
回复
加了{}表示:只有当程序运行到这个case了,才会从栈上申请局部变量的空间并初始化,运行不到就不分配空间,避免浪费
cy010510630 2010-07-03
  • 打赏
  • 举报
回复
如果是因为程序也许运行不到 3 的这种情况 所以编译器给了个警告
那么,为什么加了一个{}
case 3:
{
cout << "i is equal to 3" << endl;
int j = i + 1;
cout << "j = " << j;
}
就没有警告了呢?
加了{},case 3的情况还是不一定能运行到。
superdiablo 2010-07-03
  • 打赏
  • 举报
回复
很正常,因为程序不一定能运行到那个地方。改成这样就可以了:
case 3:
{
cout << "i is equal to 3" << endl;
int j = i + 1;
cout << "j = " << j;
}
break;
stonewater 2010-07-03
  • 打赏
  • 举报
回复
警告不是有原因吗?一看就知道了,需然有的原因是解释不对,但大部分还是一看就能明白的
liweisdut 2010-07-03
  • 打赏
  • 举报
回复
编译器把你的一个case当成一块,所以若是在其中有变量定义的话会给出警告:本变量只在本case中可用
liweisdut 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 cy010510630 的回复:]
C/C++ code
switch (i)
{
case 1:
cout << "i is equal to 1" << endl;
break;
case 2:
cout << "i is equal to 2" << endl;
bre……
[/Quote]
要在switch里使用,放在case 3的执行代码中肯定不行。而且你加了括号之后,只能在case 3一种条件下使用,其他不认识
wade_2003 2010-07-03
  • 打赏
  • 举报
回复
不要理会警告,只要结果正确
zuiyuezhou888 2010-07-03
  • 打赏
  • 举报
回复
程序也许运行不到 3 的这种情况 所以编译器给了个警告
不用管它 就像你定义了一个变量没有使用一样 编译器也会给一个警告

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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