发信人: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.*]
标题: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(舍利子~~~怪兽一朵朵),信区: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(火并科尔,谁没腰肌?),信区:CPlusPlus 标题:Re:C++对switch-case的语法有这样的要求吗? 发信站:水木社区(FriJul2212:36:562005),站内 一个块内的变量初始化不能条件性的跳过 【在Arnald(堕落兽人)的大作中提到:】 :我用gcc编译器 :下面的代码编译不过 :#include<stdio.h> :................... -- 那些在刑场上争先恐后吃袁督师肉的人,在北京两次沦陷的时候有几个挺身而出的? ※来源:·水木社区newsmth.net·[FROM:218.2.150.*] |
| ||
发信人: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(流氓理想主义者),信区:CPlusPlus 标题:Re:C++对switch-case的语法有这样的要求吗? 发信站:水木社区(FriJul2212:57:002005),站内 为什么他加了花括号以后又可以通过了呢? 【在RoachCock(火并科尔,谁没腰肌?)的大作中提到:】 :一个块内的变量初始化不能条件性的跳过 -- 流氓也要攒rp ※来源:·水木社区newsmth.net·[FROM:61.173.81.*] |
| ||
发信人: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(堕落兽人),信区: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(克己复礼),信区:CPlusPlus 标题:Re:C++对switch-case的语法有这样的要求吗? 发信站:水木社区(FriJul2213:10:022005),站内 因为括号外面没有y了。。。 【在Arnald(堕落兽人)的大作中提到:】 :能不能详细的解释一下 :为什么这样又能编译的过? :switch(value) :................... -- ※来源:·水木社区newsmth.net·[FROM:59.66.114.*] |
| ||
发信人:twingle(打断了第四根线),信区:CPlusPlus 标题:Re:C++对switch-case的语法有这样的要求吗? 发信站:水木社区(FriJul2213:10:102005),站内 加了花括号就生成了一个新的block,当然可以通过了 【在cloudd(流氓理想主义者)的大作中提到:】 :为什么他加了花括号以后又可以通过了呢? -- ※来源:·水木社区newsmth.net·[FROM:219.142.59.*] |
| ||
发信人:qbasic(没有),信区:CPlusPlus 标题:Re:C++对switch-case的语法有这样的要求吗? 发信站:水木社区(FriJul2213:10:252005),站内 木有跳过呀 没default了就没有跳过嘛 你多几个case试试就知道了 【在Arnald(堕落兽人)的大作中提到:】 :能不能详细的解释一下 :为什么这样又能编译的过? :switch(value) :................... -- 一沙一世界 一树一菩提。 ※来源:·水木社区newsmth.net·[FROM:162.105.242.*] |
| ||
发信人: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(昨我已逝),信区: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(堕落兽人),信区: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(昨我已逝),信区: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(堕落兽人),信区: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(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(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(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(没有),信区: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(昨我已逝),信区: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++, :................... -- |