C++中switch 语句中的变量声明和
switch 内部的变量定义:
int i = ;
switch(i)
{
case :
string str; //error
int val1 = ; //error
int val2; //right
int val3; val3 = ; //right
case :
val2 = ;
cout << val2 << endl;
}
《C++ Primer》 P163: 如果在某处一个带有初始值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。
在上面的代码中line 5、6是错误的,line 7、8是没问题的。
首先要明确的是,对于line 5、6、7、8中的变量来说,整个switch语句的{}内的声明之后的范围都是可见的。case语句不构成独立的作用域,即在case 0:下定义的val2,在case 1下也是可见的(红色字体貌似有问题)。
但是line5、6是错误的,因为在5、6两行都在声明变量时对变量进行了初始化(line 5 调用了默认的初始化函数),如果跳过此代码,则可能会产生不可意料的错误,编译器会报错。line 7、8是正确的,因为在声明的时候并没有对变量初始化。
(如果有初始化,那么后面的代码可以直接使用,但是如果跳过了初始化编译器就会认为会发生不可预料的错误进而报错。如果没有初始化,则编译器不会因为跳过此语句而报错,因为你本来就没有初始化并且这是c/c++允许的,比如在函数中的int a;就是一个未初始化的变量)
所以,不可以跳过带初始值的变量(同一个作用域之内)。 在goto语句中同理:
int i = ;
goto case_1; case_0:
int val1; //right
int val2 = ; //error
case_1:
val1 = ;
val2 = ;
test_scope.cpp: In function ‘int main(int, char**)’:
test_scope.cpp:7: error: jump to label ‘case_1’
test_scope.cpp:2: error: from here
test_scope.cpp:6: error: crosses initialization of ‘int val2’ (跳过了val2的初始化)
C++中switch 语句中的变量声明和的更多相关文章
- switch语句下的变量声明和定义
		switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ... 
- 在 php 7.3 中 switch 语句中使用 continue
		在 php 7.3 中 switch 语句中使用 continue 在 php 7.3 的 switch 中使用 continue 会出现警告.1 2 3 while ($foo) { switch ... 
- C++17尝鲜:在 if 和 switch 语句中进行初始化
		初始化语句 在C++17中,类似于 for 语句,在 if 和 switch 语句的判断条件之前也能加上初始化语句,语法形式如下: if (初始化语句; 条件) 语句 else 语句 switch ( ... 
- switch语句中的选择因子
		switch语句能否用作用在byte上,能否作用在long上,能否作用在String上? switch选择语句的格式为: switch(intergral-selector){ case integ ... 
- JS中switch语句做选择时为什么可以不用break?
		在JavaScript中,switch语句相比其他语言并没有特殊之处. 在使用时,我们要注意每个分支后都应加一条break语句,否则后面的分支仍然会执行.实际程序中,我发现有时没用break语句,仍然 ... 
- mysql 中alter语句中change跟modify的区别
		mysql 中alter语句中change和modify的区别可以使用CHANGE old_col_name column_definition子句对列进行重命名.重命名时,需给定旧的和新的列名称和列 ... 
- 关于switch语句中使用String类型的实现原理
		在Java 7 以后,switch语句可以用作String类型上. 从本质来讲,switch对字符串的支持,其实也是int类型值的匹配.它的实现原理如下: 通过对case后面的String对象调用ha ... 
- 1.3.1 switch 语句中的 String
		switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ... 
- 解读JavaScript中的Hoisting机制(js变量声明提升机制)
		hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ... 
随机推荐
- HDU_1166_敌兵布阵
			敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ... 
- 易忘小技巧--yum
			写在前面:日常维护系统中,如果不是天天接触,难免会忘记一些实用小技巧,本文记录自己使用的小技巧,有新发现时,会长期更新 安装epel和dnf源 # 安装epel yum -y install epel ... 
- 四角递推(CF Working out,动态规划递推)
			题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕 ... 
- 线性DP LIS浅谈
			LIS问题 什么是LIS? 百度百科 最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列. 怎么求LIS? O( ... 
- Python数据库连接池DBUtils(基于pymysql模块连接数据库)
			安装 pip3 install DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: # BDUtils数据库链接池: 模式一:基于threaing ... 
- 第八节:web爬虫之urllib(四)
			第三个 模块parse : 是一个工具模块,提供了许多 URL 处理方法,比如拆分.解析.合并等等的方法. 
- PAT 1131 Subway Map
			In the big cities, the subway systems always look so complex to the visitors. To give you some sense ... 
- MSSQL获取指定日期的SQL语句
			--1.一个月第一天的 SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0) --2.本周的星期一 SELECT DATEADD(wk,DATEDIFF(wk,0 ... 
- 【Codeforces 279C】Ladder
			[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设pre[i]表示i往前一直递增能递增多远 设aft[i]表示i往后一直递增能递增多远 如果aft[l]+pre[r]>=(r-l+1) ... 
- 消息传递(cogs 1001)
			问题描述WZland开办了一个俱乐部(这里面可以干任何的事情),这引来了许多的人来加入.俱乐部的人数越来越多,关系也越来越复杂……俱乐部的人来自各个地方,为了增加友谊,俱乐部举行了一次晚会.晚会上又进 ... 
