发信人: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(舍利子~~~怪兽一朵朵),信区: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++, :...................
--
|
分享到:
相关推荐
switch语句是C++语言中的一种控制流语句,用于根据不同的条件执行不同的代码块。在本文中,我们将详细介绍switch语句的执行过程、注意要点、例题讲解和作业等。 一、switch语句的执行过程 switch语句的执行过程...
c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助
本文为零基础的面试者提供了C/C++中switch语句的全面指南,旨在帮助他们掌握面试中可能遇到的switch语句相关问题。内容涵盖了switch语句的定义、基本语法、使用场景、优点、注意事项、与if语句的区别、实战应用、...
在大多数支持switch语句的编程语言(如C、C++、Java、C#等)中,其基本语法如下: ```markdown switch(expression) { case value1: // code to be executed if expression matches value1; break; case value...
在C++编程语言中,掌握基础是非常重要的,本章主要介绍了C++的简单程序设计,包括程序的基本结构、语句种类以及控制结构。下面将详细阐述这些知识点。 首先,程序的创建和执行过程通常涉及以下几个步骤: 1. **源...
单片机程序中,当Switch/Case语句分支较多、处理代码较长、处理情况较为复杂时,逻辑修改和程序调试均存在一定的困难。针对该问题,本文给出了使用函数指针替代Switch/Case语句的实现思路以及相对应的代码模型,为...
在C和C++中,switch语句与Java类似,但不支持字符串直接作为表达式。通常需要先将字符串转换为整型(如通过哈希函数)才能与`case`匹配。此外,C++11引入了`constexpr`关键字,使得在某些情况下可以在`case`标签中...
厦大C++关于控制语句的一些内容 语句是程序的基本单元,以分号结束。 C++语句可以分为3类: 表达式语句 复合语句 控制语句
在C++编程语言中,`switch`语句是一种条件控制结构,用于执行多个可能的代码块之一,基于一个表达式的值。它提供了一种比连续的`if...else if...else`语句更简洁、更易读的替代方式。本篇文章将深入探讨`switch`语句...
C++语句是C++语言中的最小独立计算单元,类似于自然语言中的句子。当我们想让程序执行某些操作时,我们通常编写语句。 语句的类型 C++语句有多种类型,包括: * 声明语句(Declaration statements):用于声明...
程序的基本控制结构 表达式语句 函数调用语句 空语句 复合语句 if语句、if-else语句、switch语句 while语句、do-while语句、for语句 continue语句、break语句、goto语句、return语句
这是C++重要的基本知识!希望我提供的资料能帮助阅读过的C++学习者!
实验4主要围绕C++编程中的运算符表达式、IF语句和Switch语句展开,旨在帮助学习者掌握这些基础概念并熟练运用。以下是详细的解释: 一、运算符表达式 运算符是C++中用于执行特定操作的符号,如算术运算符(+、-、*...
### C++中的流程控制语句详解 #### 一、引言 在计算机编程语言中,流程控制语句是非常重要的组成部分,它们决定了程序的执行顺序。本篇内容将围绕C++中的流程控制语句进行深入探讨,包括但不限于条件语句、循环语句...
### C++中的`switch`语句详解 在C++编程语言中,`switch`语句是一种重要的流程控制结构,主要用于实现基于表达式值的选择性执行不同的代码块。它提供了一种更加直观的方式来处理多分支条件判断,相比于使用一系列的...
Break语句是C++语言中的一种控制流语句,用于退出当前的循环体或switch语句。从测试题中可以看到,break语句可以用于循环体内,它将退出该重循环;break语句也可以用于switch语句中,它将退出switch语句。但是,...
在Python中,需要利用函数字典来模拟这一行为,而在Java、C/C++和JavaScript中,`switch`语句是语言内置的结构。理解这些差异对于跨语言开发至关重要,因为它能帮助开发者更有效地编写和维护代码。
本文将详细介绍C++中的`if`语句、决策语句块以及变量的作用域,并通过实例解释如何使用这些工具来控制程序的流程。 #### 二、C++中的决策结构 决策结构允许程序员根据特定条件的变化来控制程序的执行路径。在C++中...