switch语句的简单介绍

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

switch(expression){
case constant-expression :
f1();
break; // 可选的
case constant-expression :
f2();
break; // 可选的 // 您可以有任意数量的 case 语句
default : // 可选的
f();
}

这玩意儿其实就是为了代替多种情况下if... else if...的这种嵌套。看上去很简单对不对,但是新手总会在这里遇到麻烦:

  • constant-expression必须是一个常量或字面量。const关键字并不真正表示常量,它只是标识这个变量不可变,其实更接近readonly的含义。比如写成下面的代码就会报错:
const int second = 2;
switch(i) {
case 1: f1();
case second: f2(); //因为second并不是真正的常量,所以这里会报错
}
  • 上面的代码还有另外的隐患:一是f1()函数执行之后没有加break语句,不加break语句就会继续执行后面的f2。当然也有可能为了特殊设计就是为了执行f1然后执行f2这种逻辑。但是在绝大多数情况下,没加break都意味着错误。第二点是没加default语句。一般建议加一下,这样来保证默认情况。
  • break有时候会误用。来猜猜下面的代码会执行什么:
#include <iostream>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
using namespace std;
int array[] = {1,2,3,4,5,6,7,8,9}; int main()
{
char c = 'a';
char ci = c;
int i = 0;
bool Jump_out_of_if = true;
switch(ci){
case 'a':
if(true){
while(i<9){
cout << array[i] << endl;
++i;
break;
}
if(Jump_out_of_if)
break;
while(i<9){
cout << array[i] << endl;
++i;
break;
}
cout << "未跳出if" << endl;
} //代码原来的意思是想跳出外层if
cout << "成功跳出了if" << endl;
break;
case 'b':
cout << "not output" << endl;
break;
default:
cout << "do nothing" << endl;
}
}

在给出结果之前,我们先来分析下这段代码。这段代码里case 'a'里有几处都有break语句,一是while循环里有break语句,二是if语句里有break语句,三是case语句有也break语句。看看下图的结果。再分析下源代码,首先while循环的break会跳出循环,if语句的break会直接跳出case 'a',因为if里面没有break这一说法。所以后面的 cout << "成功跳出了if" << endl; 语句不会执行,所以结果是只打印了一个1。

最后还是不得不吐槽这switch语句的break也太不人性化了,为了极少数情况,不得不再每个case后加break!!!

See you next time. Happy Coding!!!

我的github

c/c++排坑(3) -- c/c++中的switch语句的更多相关文章

  1. Java中的switch语句后面的控制表达式的数据类型

    Java中的switch语句后面的控制表达式的数据类型 1.byte 2.char 3.short 4.int 5.枚举类型 6.Java 7允许java.lang.String类型

  2. 排坑&#183;IPhone&IOS中不兼容正则中的断言匹配

    阅文时长 | 1.14分钟 字数统计 | 1834.4字符 主要内容 | 1.问题切入 2.什么是断言匹配 3.断言匹配的替换方案 4.声明与参考资料 『排坑·IPhone&IOS中不兼容正则 ...

  3. Java中的switch语句——通过示例学习Java编程(8)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...

  4. ECMA中的switch语句

    switch借鉴自其他语言,但也有自己的特色. 1.可以在switch语句中使用任何数据类型(数值.字符串.对象等),很多其他语言中只能使用数值. 2.每个case的值不一定是常量,可以是变量或者表达 ...

  5. [译]Javascript中的switch语句

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  6. 通过字节码分析java中的switch语句

    在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下): public class Ag{ static pub ...

  7. c/c++排坑(5) -- c语言中的申明

    C语言的申明总是令人头大,对于这块内容也一直让我头疼.希望通过这篇博客能够稍微梳理一下.材料和例子来源于<C专家编程> 一.C语言的申明的优先级规则 先来个例子,看看下面这行C代码到底是个 ...

  8. c/c++排坑(4) -- c/c++中返回局部变量

    返回c语言中的局部变量 先看一段代码猜猜,打印值: #include <iostream> using namespace std; char * func(); int main() { ...

  9. c/c++排坑(2) -- c语言中的符号重载

    所谓的符号重载就是在不同的上下文环境里有不同的意义.甚至有些关键字也被重载而具有好几种意义,这也是C语言的作用域规则对程序员不那么清晰的主要原因. 本章内容摘自<c专家编程>P37. 大家 ...

随机推荐

  1. ios oc 代码 转换为 c++ 描述代码编译过程

    clang -rewrite-objc main.m #import <Foundation/Foundation.h> #import <objc/runtime.h> // ...

  2. centos命令行安装mysql随机密码查看方法(遇到问题及其解决办法)

    mysql初次命令行安装登录时报错: 未输入密码:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwo ...

  3. Android Studio最新配置教程2016

    http://blog.csdn.net/wen_demo 一.Android studio 基本简单介绍 1.Android studio和Eclipse的差别: 1.Studio中有Project ...

  4. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  5. bzoj 5090 组题

    题目大意: 一个数列,求一段长度不少于k的数 使平均值最大 思路: 把所有数列里的数,转换为(i,sum i)的点 然后求一个下凸包,在这个过程中对于长度特殊处理一下,使栈内至少有一段长度大于等于k ...

  6. MSP430:AD10

    使用的MSP430G2553,为AD10,正常有8路输出,P1.0-P1.7为A0-A7 有七个寄存器, 参考电压可以是VCC或者内部参考电压1.5V或者2.5V 参考时钟可以是内部ADC10OSC ...

  7. 【已解决】Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop(转载)

    转自: http://www.crifan.com/makefile_error_make_no_rule_to_make_target_needed_by_stop/ [问题] 有个已有的Makef ...

  8. zhw大神线段树姿势

    ; i<; i++) tree[i][]=tree[i][]=i; ; i>=; i--) tree[i][]=tree[i+i][], tree[i][]=tree[i+i+][]; v ...

  9. 绑定树tree 的后台方法

    #region 获取部门列表树集合         /// <summary>         /// 获取部门列表树集合         /// </summary>     ...

  10. 【NOIP2016】DAY1 T2 天天爱跑步

    [NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...