浅谈c中switch的暴力跳转
2015-08-23 20:04
295 查看
今日是二零一伍年八月二十三日,今天在课堂学习了misra_c,那是一种用于汽车制造业的c语言的标准。相对于用于编程的要求,它其实更加的严格,比如什么不能使用原有的变量名,笔者在这里也不做详细讲解,不过可以为大家推荐一篇文章:http://blog.csdn.net/pony_maggie/article/details/5270335
讲讲今天的主题,我们的switch语句。在编程时发现switch语句的一个特点,就是暴力搜索比如这样一个程序:
// switch.cpp
#include <stdio.h>
#include <stdlib.h>
int main (){
int x = 1 , flag = 1 ;
switch(x){
case 1 :
if(flag){
printf("case 1 \n") ;
case 2 :
printf("case2\n") ;
}
break ;
default :
printf("default\n");
break ;
}
return ;
}现在我得到的结果是:
case 1
case 2
switch语句会进行到break语句的那一刻,所以case 2 也被打印了。此时我们再尝试转换一下x与flag的值,把x赋值为2,而flag赋值为0,然后再运行。这个时候结果只会是case 2。想想有些奇怪,难道放在if scope里面的case 2 :被访问到了?
这样,我们就只能认为switch语句是直接暴力地在swith里搜索case,这个有点像goto,不论你的作用域在什么地方,直接暴力搜索,暴力跳转。所以后,我们在使用switch和goto这样暴力语句时一定要谨慎。
讲讲今天的主题,我们的switch语句。在编程时发现switch语句的一个特点,就是暴力搜索比如这样一个程序:
// switch.cpp
#include <stdio.h>
#include <stdlib.h>
int main (){
int x = 1 , flag = 1 ;
switch(x){
case 1 :
if(flag){
printf("case 1 \n") ;
case 2 :
printf("case2\n") ;
}
break ;
default :
printf("default\n");
break ;
}
return ;
}现在我得到的结果是:
case 1
case 2
switch语句会进行到break语句的那一刻,所以case 2 也被打印了。此时我们再尝试转换一下x与flag的值,把x赋值为2,而flag赋值为0,然后再运行。这个时候结果只会是case 2。想想有些奇怪,难道放在if scope里面的case 2 :被访问到了?
这样,我们就只能认为switch语句是直接暴力地在swith里搜索case,这个有点像goto,不论你的作用域在什么地方,直接暴力搜索,暴力跳转。所以后,我们在使用switch和goto这样暴力语句时一定要谨慎。
相关文章推荐
- PHP8新特性之match表达式
- c++ primer 第五版 笔记前言
- PostgreSQL新手入门教程
- 那些年,我还在学习C# 学习笔记续
- Ruby 魔法 学习笔记之一
- 三个有用的 Switch 命令
- Lua和C语言的交互详解
- sqlserver 数据库学习笔记
- CSS学习笔记Padding 属性中参数的定义与使用
- prototype 1.5 & scriptaculous 1.6.1 学习笔记
- prototype 学习笔记整理
- Oracle学习笔记(六)
- 关于SQLServer2005的学习笔记 XML的处理
- Jquery 基础学习笔记
- ExtJs 学习笔记基础篇 Ext组件的使用第1/2页
- 关于C语言中参数的传值问题
- linux Shell学习笔记第五天
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- Jquery 学习笔记(二)