Switch-case 内定义变量的问题
Switch-case 内定义变量的问题
这个问题需要分开讨论,C 语言和 C++ 的标准定义是不同的。
C++
int Caset(int a) {
switch (a) {
case 1:
int b = 1;
std::cout<<"a==1: "<<b<<std::endl;
break;
case 2:
b = 2;
std::cout<<"a==2: "<<b<<std::endl;
break;
}
}
编译报错信息为
simple.cc:35:9: error: cannot jump from switch statement to this case label
case 2:
^
simple.cc:32:17: note: jump bypasses variable initialization
int b = 1;
^
也就是说,跳到 case2 的这个地方,忽略了对于 b 这个变量的初始化,这个很直观,就是在这里我找不到 b。
那么如果改成
int Caset(int a) {
switch (a) {
case 1:
int b;
b = 1;
std::cout<<"a==1: "<<b<<std::endl;
break;
case 2:
b = 2;
std::cout<<"a==2: "<<b<<std::endl;
break;
}
}
顺利成功,没有报错,如果 a 为 2,那么输出 b 也是 2,说明逻辑没有问题。那么问题来了,b 在前面声明,为什么后面可以用到呢,因为 switch-case 的逻辑控制就是用 label 来标记跳转的,而不是别的复杂的逻辑控制,所以 b 的作用域是在整个 switch 的花括号内,关于这个问题见知乎讨论请教switch内部的变量定义问题。
C 语言
上面两种写法统统出错,
void Caset(int a) {
switch (a) {
case 1:
/* one style */
int b;
b = 1;
/* another style */
int b = 1;
printf("1: %d", b);
break;
case 2:
b = 2;
printf("2: %d", b);
break;
}
}
两种写法都错
First style:
main.c:12:13: error: expected expression
int b;
^
main.c:13:13: error: use of undeclared identifier 'b'
b = 1;
^
Another style:
ttt.c:11:13: error: expected expression
int b = 1;
^
意思是说,此处需要一个表达式(expression),而不是一个变量声明初始化。有一个很黑客的做法,如下:
void Caset(int a) {
switch (a) {
case 1:
;
int b = 1;
// b = 1;
printf("1: %d \n", b);
break;
case 2:
b = 2;
printf("2: %d \n", b);
break;
}
}
这个很不能理解了,其实也就是说保证 case 后面跟着的确实是 expression 即可。考虑一下 C++ 代码出现的问题:跳过变量的声明?C 语言中同样跳过,但是编译器不认为这个是错误,而且逻辑上面也是没有问题的,在后面的 case 中可以正常给变量赋值,但是如果 case2 中,我不是给 b 赋值,而是直接访问 b,那返回的数值就是一个随机的错误的数据了,我在我的电脑上使用 gcc 编译,若直接读取数据,得到的是 0,当然编译通过,连警告都没有。
总结起来就是:
- C 编译器允许一个 case 使用另一个 case 后声明定义的变量,但是 C++ 语法不允许这个
- C 不允许 case 后面紧跟声明或定义,只允许表达式(expression); C++ 对这个没有限制
通用解法
当然我认为这样的代码可读性差,比较好的做法可以是将声明变量的事情放在头上做。
void Caset(int a) {
switch (a) {
int b;
case 1:
b = 1;
// b = 1;
printf("1: %d \n", b);
break;
case 2:
b = 2;
printf("2: %d \n", b);
break;
}
}
但是要留心, switch 和 case 之前那块地方也就只能写写这样的声明,写别的表达式,赋值啊什么的,统统是不会生效的。
参考:
Why can't variables be declared in a switch statement?这个链接中我个人比较推荐 AnT 的回答,讲清楚了问题的原因和解决方案的原理
Switch-case 内定义变量的问题的更多相关文章
- case中定义变量
1.c语言switch/case中定义变量 case 0: int b = 0 ; printf("0");break; case 1: printf("1" ...
- c/c++ switch case内括号
如果在case语句中有定义变量,则必须要加{},否则会报错.
- java中的Switch case语句
java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的 ...
- ansible中定义变量的若干方法
Ansible支持十几种定义变量的方式 根据优先级排序的定义方式: Inventory变量 Host Facts变量 Playbook变量 Playbook提示变量 变量文件 命令行变量 1.Inve ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- swtich和case语句中,定义变量要加花括号
转自: http://blog.chinaunix.net/uid-27103408-id-3340702.html http://www.xuebuyuan.com/2070170.html swi ...
- C++在循环内和循环外定义变量的差异
原文:http://blog.csdn.net/cashey1991/article/details/45127561 最后总结: 对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力 ...
- Thymeleaf 之 内置对象、定义变量、URL参数及标签自定义属性
Thymeleaf 之 内置对象.定义变量.URL参数及标签自定义属性 本文章来自[知识林] 如标题所述,这篇文章主要讲述Thymeleaf中的内置对象(list解析.日期格式化.数字格式化等).定义 ...
- 在函数内部定义的变量加与不加var的区别,匿名函数和有名函数内声明变量的区别
2014年4月21日,14:49分: 原创:http://www.cnblogs.com/liujinyu/p/3678523.html 今天写天气网英文版的产品频道,maps页面的js时,偶然意识到 ...
随机推荐
- 使用Tomcat的Reload提高开发速度(翻译)
欢迎转载http://www.cnblogs.com/coodream2009,有翻译的不太准确的地方请大家指出,我继续修改完善. 按照Java Servlet规范第四部分推荐的,Tomcat系统的实 ...
- 有关求任意一个正整数的n的因数的个数的求解思路
已知条件:n=p1^a1xp2^a2xp3^a3........xpk^ak;求解n的因数的个数: 求解的主要思想:递归 设所有的因数的个数为U1: 则U1会等于什么呢? 不妨设求得p2^a2xp3^ ...
- Java集合干货——ArrayList源码分析
ArrayList源码分析 前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体 ...
- Jmeter脚本调试之关联----(正则表达式)
脚本调试 关联,在脚本中,是必应用到的一个设置方法,将脚本中,每次都会动态变化的特殊值进行关联.一个能正确执行的脚本,都需要进行关联(LR.jmeter). Jmeter关联: 在脚本回放过程中,客户 ...
- BZOJ 3105: [cqoi2013]新Nim游戏
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意是要取一些数使得剩余的数xor和的子集不为0 拟阵.求解极大线性无关组.贪心从大到小 ...
- Codeforces Round #331 (Div. 2) _A. Wilbur and Swimming Pool
A. Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megabytes input s ...
- input[type=file]中使用ajaxSubmit来图片上传
今天在使用input[type=file]上传图片到服务器时,因为项目要求,并不是像常见的通过按钮来提交表单事件,而是图片上传后就自动执行表单提交事件,将上传的图片信息传给服务器. 刚开始我是这样执行 ...
- JavaScript八张思维导图—Date用法
JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...
- 解决mysql不是内部或外部命令
安装Mysql后,当我们在cmd中敲入mysql时会出现'Mysql'不是内部或外部命令,也不是可运行的程序或其处理文件. 工具/原料 mysql cmd 方法/步骤 1 打开我的电脑在我的电脑右键中 ...
- dede 内容页文章标题显示不全的更改方法
找到include/taglib/arclist.lib.php 1.$titlelen = AttDef($titlelen,30);换成$titlelen = AttDef($titlelen,2 ...