c++ switch语句中的猫腻

news/2024/8/25 17:39:14 标签: C, C++, C#, .net, GCC
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:28:082005),站内

我用gcc编译器
下面的代码编译不过

#include<stdio.h>

intmain()
{
inti;
switch(i)
{
case3:
inty=0;
break;
default:
break;
}
}

出错提示
main.cpp:Infunction`intmain()':
main.cpp:11:jumptocaselabel
main.cpp:9:crossesinitializationof`inty'

但是把case里面用{}括起来,或者改成“inty;y=0;”,就可以编译过
以前都没有注意到C++还哟这个限制
不明白为什么C++会有这样的语法限制呢???
望指教


--
金钱不能解决一切,但是可以解决我;暴力不能解决一切,但是可以解决你


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:coolest] [进入讨论区] [返回顶部] 2
发信人:coolest(舍利子~~~怪兽一朵朵),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:34:022005),站内

首先default需要break吗?我怎么记得不用的
二来,inty在这里没有任何用处,出了switch也就出了域,可能就是因为这个原因
你修改了以后,y=0这句就用上了
【在Arnald(堕落兽人)的大作中提到:】
:我用gcc编译器
:下面的代码编译不过
:#include<stdio.h>
:...................

--
我是清都山水郎天教懒慢带疏狂
曾批给露支风敕累奏留云借月章
诗万首酒千觞几曾着眼看侯王
玉楼金阙慵归去且插梅花醉洛阳


※来源:·水木社区newsmth.net·[FROM:211.156.222.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:RoachCock] [进入讨论区] [返回顶部] 3
发信人:RoachCock(火并科尔,谁没腰肌?),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:36:562005),站内

一个块内的变量初始化不能条件性的跳过

【在Arnald(堕落兽人)的大作中提到:】
:我用gcc编译器
:下面的代码编译不过
:#include<stdio.h>
:...................

--
那些在刑场上争先恐后吃袁督师肉的人,在北京两次沦陷的时候有几个挺身而出的?


※来源:·水木社区newsmth.net·[FROM:218.2.150.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:eastcrusader] [进入讨论区] [返回顶部] 4
发信人:eastcrusader(昨我已逝),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:54:262005),站内

有这种限制,如果你定义一个变量,并且在后面还要使用它,那么它的
定义部分不能被条件跳过。比如你不能这样:
if(flag==true)
intj=0;

if(j==0)
....

将会给出j没有定义之类的错误。
【在Arnald(堕落兽人)的大作中提到:】
:我用gcc编译器
:下面的代码编译不过
:#include<stdio.h>
:...................

--

※来源:·水木社区newsmth.net·[FROM:221.218.19.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:cloudd] [进入讨论区] [返回顶部] 5
发信人:cloudd(流氓理想主义者),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:57:002005),站内

为什么他加了花括号以后又可以通过了呢?

【在RoachCock(火并科尔,谁没腰肌?)的大作中提到:】
:一个块内的变量初始化不能条件性的跳过


--
流氓也要攒rp


※来源:·水木社区newsmth.net·[FROM:61.173.81.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Arnald] [进入讨论区] [返回顶部] 6
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2212:59:232005),站内

只是讨论语法问题

如果想你说的,也只应该是warning,而不是error

【在coolest(舍利子~~~怪兽一朵朵)的大作中提到:】
:首先default需要break吗?我怎么记得不用的
:二来,inty在这里没有任何用处,出了switch也就出了域,可能就是因为这个原因
:你修改了以后,y=0这句就用上了



--
金钱不能解决一切,但是可以解决我;暴力不能解决一切,但是可以解决你


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Arnald] [进入讨论区] [返回顶部] 7
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:01:132005),站内

能不能详细的解释一下

为什么这样又能编译的过?
switch(value)
{
case1:
inty;
y=1;
}




【在RoachCock(火并科尔,谁没腰肌?)的大作中提到:】
:一个块内的变量初始化不能条件性的跳过



--
我在改code的时候总在想,我底是在refactor,还是在hack。


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:jijiliang] [进入讨论区] [返回顶部] 8
发信人:jijiliang(克己复礼),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:10:022005),站内

因为括号外面没有y了。。。
【在Arnald(堕落兽人)的大作中提到:】
:能不能详细的解释一下
:为什么这样又能编译的过?
:switch(value)
:...................

--

※来源:·水木社区newsmth.net·[FROM:59.66.114.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:twingle] [进入讨论区] [返回顶部] 9
发信人:twingle(打断了第四根线),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:10:102005),站内

加了花括号就生成了一个新的block,当然可以通过了

【在cloudd(流氓理想主义者)的大作中提到:】
:为什么他加了花括号以后又可以通过了呢?


--

※来源:·水木社区newsmth.net·[FROM:219.142.59.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:qbasic] [进入讨论区] [返回顶部] 10
发信人:qbasic(没有),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:10:252005),站内

木有跳过呀
没default了就没有跳过嘛
你多几个case试试就知道了
【在Arnald(堕落兽人)的大作中提到:】
:能不能详细的解释一下
:为什么这样又能编译的过?
:switch(value)
:...................

--
一沙一世界
一树一菩提。


※来源:·水木社区newsmth.net·[FROM:162.105.242.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Arnald] [进入讨论区] [返回顶部] 11
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:13:532005),站内

什么没有跳过?

下面的代码在intz=0上编译错误
switch(value)
{
case1:
inty;
y=1;//compileok
break;
case2:
intz=0;//compileerror
break;
default:
break;
}


【在qbasic(没有)的大作中提到:】
:木有跳过呀
:没default了就没有跳过嘛
:你多几个case试试就知道了



--
“我是有老婆的男人,不要和我说ppmm,不然回去会跪挫衣板的。”
——老婆让我使用的签名档


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:eastcrusader] [进入讨论区] [返回顶部] 12
发信人:eastcrusader(昨我已逝),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:16:062005),站内

这个问题的解释如下,如果你在一个swith语句中,
如果有如下情况出现:
switch(flag){
caseflag1:
inta;
break;
caseflag2;
....
break;
}

那么flag1中的定义inta,在flag2的语句中是可以
直接访问的,这时候,不管你在flag2的语句中是否存
在访问a的语句,他都认为a的这种定义非法(因为它认
为你有在其他flag中访问变量a的可能),等价于我
前面提到的这种情况:
if(flag)
inta=0;
if(a==0)
...
但是,如果你用{},这时flag1的内容就是一个语句块
,明确的告诉编译器,a的定义在其他的flag中是不可
见的,这时就是合法语句。

功力不够,不知道自己说明白了没有。

【在Arnald(堕落兽人)的大作中提到:】
:能不能详细的解释一下
:为什么这样又能编译的过?
:switch(value)
:...................

--

※修改:·eastcrusader于Jul2213:31:29修改本文·[FROM:221.218.19.*]
※来源:·水木社区newsmth.net·[FROM:221.218.19.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Arnald] [进入讨论区] [返回顶部] 13
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:36:352005),站内

谢谢解释
这可以解释为什么加了{}就可以编译过,但是为什么下面的也能编译过呢?


switch(flag){
caseflag1:
inta;
a=1;

break;
caseflag2;
....
break;
}
【在eastcrusader(昨我已逝)的大作中提到:】
:这个问题的解释如下,如果你在一个swith语句中,
:如果有如下情况出现:
:switch(flag){
:...................



--
金钱不能解决一切,但是可以解决我;暴力不能解决一切,但是可以解决你


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:eastcrusader] [进入讨论区] [返回顶部] 14
发信人:eastcrusader(昨我已逝),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:44:412005),站内

此时,编译器认为inti;是一个declaration(声明),而不是一个定义(definition),
这个时候编译器显得比较弱智,你看如下语句很荒谬,但是可以通过:
switch(tag){
case1:
inty;
y=0;
break;
default:
y=100;
}
但是这样按照我们的逻辑是不对的,觉得编译器发现不了,呵呵。如果你写
inti=0;
那么它就是一个定义了,呵呵,编译器就发现了错误。

其实这个语句与下面的语句等价理解,错是没有错的,但是和大家认为的逻辑不同,
特别在编译器内部的逻辑认为是和这个等价的:
switch(i){
inty;
case1:
y=0;
break;
default:
y=100;
break;
}
【在Arnald(堕落兽人)的大作中提到:】
:谢谢解释
:这可以解释为什么加了{}就可以编译过,但是为什么下面的也能编译过呢?
:switch(flag){
:...................

--

※修改:·eastcrusader于Jul2213:49:13修改本文·[FROM:221.218.19.*]
※来源:·水木社区newsmth.net·[FROM:221.218.19.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:Arnald] [进入讨论区] [返回顶部] 15
发信人:Arnald(堕落兽人),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2213:52:072005),站内

明白了
谢谢

【在eastcrusader(昨我已逝)的大作中提到:】
:此时,编译器认为inti;是一个declaration(声明),而不是一个定义(definition),
:这个时候编译器显得比较弱智,你看如下语句很荒谬,但是可以通过:
:switch(tag){
:...................



--
#include<stdio.h>
intmain(){char*p="#include<stdio.h>%cintmain(){char*p=%c%s%c;printf(p,10,34,p,34,10);}%c";printf(p,10,34,p,34,10);}


※来源:·水木社区http://newsmth.net·[FROM:219.142.125.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:jasss] [进入讨论区] [返回顶部] 16
发信人:jasss(robot),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2214:02:422005),站内


【在eastcrusader(昨我已逝)的大作中提到:】
:此时,编译器认为inti;是一个declaration(声明),而不是一个定义(definition),

Thisisnotcorrect,inC++

inti;

isaperfectdefinition,notadeclarationinc++,
andpleasenoteC++doesnothavetentativedefinition...

:这个时候编译器显得比较弱智,你看如下语句很荒谬,但是可以通过:
:switch(tag){
:case1:
:inty;
:y=0;

Here
inty;
isadefinition,and

y=0;

isa*assignment*,nota*initialization*...

:break;
:default:
:y=100;
:}
:但是这样是不对的,编译器它发现不了,呵呵。如果你写
:inti=0;

However,

inti=0;

isadefinitionwith*initialization*...

:那么它就是一个定义了,呵呵,编译器就发现了错误。

Actuallywrite
inti=0;
withintheswitch-caseisnotanerror,theproblem
isyoucannotskipit...


--

※来源:·水木社区http://newsmth.net·[FROM:192.51.44.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:ilovecpp] [进入讨论区] [返回顶部] 17
发信人:ilovecpp(cpp),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2214:14:162005),站内

ThisseemstobeaFAQ.Couldyoucontributeone?

【在jasss(robot)的大作中提到:】
:Thisisnotcorrect,inC++
:inti;
:isaperfectdefinition,notadeclarationinc++,
:...................

--

※来源:·水木社区newsmth.net·[FROM:218.249.22.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:jasss] [进入讨论区] [返回顶部] 18
发信人:jasss(robot),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2214:22:482005),站内


【在Arnald(堕落兽人)的大作中提到:】
:谢谢解释
:这可以解释为什么加了{}就可以编译过,但是为什么下面的也能编译过呢?

Toexplaintherationale,Ichangedyourcodeto:

switch(flag){
caseflag1:
inta;//herenoinitializationfora
a=1;//thisassignmentisirrelative
break;
caseflag2:
intb=1;//Noteherewehaveinitializationforb
break;
default:
//andwestillinthesamescopehere
//
break;

}

Here,for
inta;
thecompilerdoesnotcareaboutitsactualcontent,since
youdidnotinitializeit.Garbageisok...

However,for
intb=1;
thecompilerknowsArnaldneedsaintegerbwith1asits
initialvalue.Anditalsofounditispossiblethatindefault
region,thebcanbeused.Sincethecompilercannotmakesure
thebwillbeinitializedcorrectlyforeveryflag,thenitjust
issueanerror(warningforsomeothercompilers),andhopeyou
canhandleit...

Andifyouremovethedefaultpart,theerrorwilldispear,
sincethereisnoinitialization*skip*now...

Justputtheminthecasescopeifyoureallywantit...
--

※来源:·水木社区http://newsmth.net·[FROM:192.51.44.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:qbasic] [进入讨论区] [返回顶部] 19
发信人:qbasic(没有),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2214:29:332005),站内

nod

如果吧上面的弄到下面去,即使没有default一个好点的编译器也会大声抱怨


【在jasss(robot)的大作中提到:】
:标题:Re:C++对switch-case的语法有这样的要求吗?
:发信站:水木社区(FriJul2214:22:482005),站内
:
:
:【在Arnald(堕落兽人)的大作中提到:】
::谢谢解释
::这可以解释为什么加了{}就可以编译过,但是为什么下面的也能编译过呢?
:
:Toexplaintherationale,Ichangedyourcodeto:
:
:switch(flag){
:caseflag1:
:inta;//herenoinitializationfora
:a=1;//thisassignmentisirrelative
:break;
:caseflag2:
:intb=1;//Noteherewehaveinitializationforb
:break;
:default:
://andwestillinthesamescopehere
://
:break;
:
:}
:
:Here,for
:inta;
:thecompilerdoesnotcareaboutitsactualcontent,since
:youdidnotinitializeit.Garbageisok...
:
:However,for
:intb=1;
:thecompilerknowsArnaldneedsaintegerbwith1asits
:initialvalue.Anditalsofounditispossiblethatindefault
:region,thebcanbeused.Sincethecompilercannotmakesure
:thebwillbeinitializedcorrectlyforeveryflag,thenitjust
:issueanerror(warningforsomeothercompilers),andhopeyou
:canhandleit...
:
:Andifyouremovethedefaultpart,theerrorwilldispear,
:sincethereisnoinitialization*skip*now...
:
:Justputtheminthecasescopeifyoureallywantit...
:--
:
:※来源:·水木社区http://newsmth.net·[FROM:192.51.44.*]


--
一沙一世界
一树一菩提。


※来源:·水木社区newsmth.net·[FROM:162.105.242.*]

[本篇全文] [回复文章] [回信给作者] [本篇作者:eastcrusader] [进入讨论区] [返回顶部] 20
发信人:eastcrusader(昨我已逝),信区:CPlusPlus
标题:Re:C++对switch-case的语法有这样的要求吗?
发信站:水木社区(FriJul2214:30:442005),站内

yes,youareright,inc++syntax,
definitioni=0;//initialized
definitioni;//uninitialized

allarevalid.theyarealldefinition.all
thecompilingtimeerrorscomefromthedifference
ofinitializedornot,whichistheoneoftheessential
difffromtheClanguage.Ithinkhereshouldbe
somethingtodistinguishthe2kindsofdefinition,
atleastinchinese.
Ithinkthisinvolvesthe"ideology"ofC++and
C,abouttheinitialization.herearelotsofsyntax
problemsaoutinitialization.
wewelcomeyourideaaboutthis,:).
【在jasss(robot)的大作中提到:】
:Thisisnotcorrect,inC++
:inti;
:isaperfectdefinition,notadeclarationinc++,
:...................

--


http://www.niftyadmin.cn/n/604147.html

相关文章

EXT

Ext中有两个很重要的方法,一个是decode;一个是encode.顾名思义,一个是编码,一个是解码,你难道真的这么想吗? 严格的说,一个是将json字符串转换成对象;一个是将对象转换成json字符串下面这个示例主要介绍的是Ext.decode()和Ext.encode()的用法&#xff0c;其中使用到了json格式…

微信开发.Net 接入示例

为什么80%的码农都做不了架构师&#xff1f;>>> 微信公众平台接口开发官方仅提供了 PHP 接入示例代码&#xff0c; 网上找到的.Net代码多半需要积分下载&#xff0c; 所以自己写了一个 如下&#xff1a; <% Page Language"C#" %> <script run…

perl处理文本经验积累(不断更新中)

1. 把同根路径不同文件包中同名的文件合并 例子: 作用描述: 问题&#xff1a;现有五个目录分别存放5个领域的文件F:\...\fold\canyin\sysF:\...\fold\jiaotong\sysF:\...\fold\lvyou\sysF:\...\fold\shangwu\sysF:\...\fold\tiyu\sys而每个F:\...\fold\xxx\sys目录下面有18个…

hibernate 主键生成策略

1、 native对于 oracle 采用 Sequence 方式&#xff0c;对于MySQL 和 SQL Server 采用identity&#xff08;自增主键生成机制&#xff09;&#xff0c;native就是将主键的生成工作交由数据库完成&#xff0c;hibernate不管&#xff08;很常用&#xff09;2、AssignedAssigned方…

ToArray()和IEnumerableT,ListT

一&#xff1a;ToArray() 在程序中&#xff0c;我们往往习惯使用List<>这种集合类&#xff0c;但是程序中却要求需要传递一个数组,List<>已经为我们提供了toArray()方法 二:IEnumerable<T> 在MSDN上&#xff0c;是这么说的&#xff0c;它是一个公开枚举数&am…

UC_online在线抽奖_新浪UC(Tab页功能)

代码如下: <map name"nav"> <area alt"" coords"4,0,98,32" href"http://www.51uc.com/activity/5_6_uc/" target_blank> <area alt"" coords"114,1,252,33" href"http://service.51uc.com/…

使用两个tomcat 更改端口

首先&#xff1a; 在Tomcat的根&#xff08;安装&#xff09;目录下&#xff0c;有一个conf文件夹&#xff0c;双击进入conf文件夹&#xff0c;在里面找到Server.xml文件&#xff0c;打开该文件。其次&#xff1a;在文件中找到如下文本&#xff1a; <Connector port"80…

带农历的日历

代码如下: <SCRIPT languagejavascript> <!-- //带农历的日历 var bsYear; var bsDate; var bsWeek; var arrLen8; //数组长度 var sValue0; //当年的秒数 var dayiy0; //当年第几天 var miy0; //月份的下标 var iyear0; //年份标记 var dayim0; //当月第几天 var spd…