`
happmaoo
  • 浏览: 4546707 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

c++ switch语句中的猫腻

阅读更多
发信人: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++,
:...................

--

分享到:
评论

相关推荐

    C++语言:switch语句最详细讲解.pdf

    switch语句是C++语言中的一种控制流语句,用于根据不同的条件执行不同的代码块。在本文中,我们将详细介绍switch语句的执行过程、注意要点、例题讲解和作业等。 一、switch语句的执行过程 switch语句的执行过程...

    switch语句,算利润

    c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助

    cc++程序员面试宝典-switch语句

    本文为零基础的面试者提供了C/C++中switch语句的全面指南,旨在帮助他们掌握面试中可能遇到的switch语句相关问题。内容涵盖了switch语句的定义、基本语法、使用场景、优点、注意事项、与if语句的区别、实战应用、...

    switch语句大全下载

    在大多数支持switch语句的编程语言(如C、C++、Java、C#等)中,其基本语法如下: ```markdown switch(expression) { case value1: // code to be executed if expression matches value1; break; case value...

    C++基本语句欢迎下载

    在C++编程语言中,掌握基础是非常重要的,本章主要介绍了C++的简单程序设计,包括程序的基本结构、语句种类以及控制结构。下面将详细阐述这些知识点。 首先,程序的创建和执行过程通常涉及以下几个步骤: 1. **源...

    用函数指针替代Switch/Case语句的程序设计方法

    单片机程序中,当Switch/Case语句分支较多、处理代码较长、处理情况较为复杂时,逻辑修改和程序调试均存在一定的困难。针对该问题,本文给出了使用函数指针替代Switch/Case语句的实现思路以及相对应的代码模型,为...

    switch语句.pdf

    在C和C++中,switch语句与Java类似,但不支持字符串直接作为表达式。通常需要先将字符串转换为整型(如通过哈希函数)才能与`case`匹配。此外,C++11引入了`constexpr`关键字,使得在某些情况下可以在`case`标签中...

    C++控制语句

    厦大C++关于控制语句的一些内容 语句是程序的基本单元,以分号结束。 C++语句可以分为3类: 表达式语句 复合语句 控制语句

    程序举例switch语句

    在C++编程语言中,`switch`语句是一种条件控制结构,用于执行多个可能的代码块之一,基于一个表达式的值。它提供了一种比连续的`if...else if...else`语句更简洁、更易读的替代方式。本篇文章将深入探讨`switch`语句...

    C++语句和程序结构(英文)

    C++语句是C++语言中的最小独立计算单元,类似于自然语言中的句子。当我们想让程序执行某些操作时,我们通常编写语句。 语句的类型 C++语句有多种类型,包括: * 声明语句(Declaration statements):用于声明...

    c++控制语句 控制结构

    程序的基本控制结构 表达式语句 函数调用语句 空语句 复合语句 if语句、if-else语句、switch语句 while语句、do-while语句、for语句 continue语句、break语句、goto语句、return语句

    SWITCH语句的使用

    这是C++重要的基本知识!希望我提供的资料能帮助阅读过的C++学习者!

    实验指导书4实验4运算符表达式;IF语句Switch语句visualc课件.pdf

    实验4主要围绕C++编程中的运算符表达式、IF语句和Switch语句展开,旨在帮助学习者掌握这些基础概念并熟练运用。以下是详细的解释: 一、运算符表达式 运算符是C++中用于执行特定操作的符号,如算术运算符(+、-、*...

    C++考试流程控制语句

    ### C++中的流程控制语句详解 #### 一、引言 在计算机编程语言中,流程控制语句是非常重要的组成部分,它们决定了程序的执行顺序。本篇内容将围绕C++中的流程控制语句进行深入探讨,包括但不限于条件语句、循环语句...

    switch.docx `switch`语句是C++中的一种流程控制语句,通常用于根据表达式的值选择执行不同的代码块 下面是`

    ### C++中的`switch`语句详解 在C++编程语言中,`switch`语句是一种重要的流程控制结构,主要用于实现基于表达式值的选择性执行不同的代码块。它提供了一种更加直观的方式来处理多分支条件判断,相比于使用一系列的...

    c++随堂测试1.docx

    Break语句是C++语言中的一种控制流语句,用于退出当前的循环体或switch语句。从测试题中可以看到,break语句可以用于循环体内,它将退出该重循环;break语句也可以用于switch语句中,它将退出switch语句。但是,...

    不同编程语言的switch语句

    在Python中,需要利用函数字典来模拟这一行为,而在Java、C/C++和JavaScript中,`switch`语句是语言内置的结构。理解这些差异对于跨语言开发至关重要,因为它能帮助开发者更有效地编写和维护代码。

    c++if语句、决策语句块和变量作用域

    本文将详细介绍C++中的`if`语句、决策语句块以及变量的作用域,并通过实例解释如何使用这些工具来控制程序的流程。 #### 二、C++中的决策结构 决策结构允许程序员根据特定条件的变化来控制程序的执行路径。在C++中...

Global site tag (gtag.js) - Google Analytics