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. unity3d-23种设计模式全解析

    http://www.jianshu.com/nb/4161593 2016.08.03 09:26 字数 1203 阅读 584评论 0喜欢 14 希望大家能共同学习,交流 谢谢支持zero(QQ: ...

  2. 拥抱开源——Linux C/C++程序猿必须熟悉的开源项目

    作为一个经验丰富的Linux C/C++程序猿, 肯定亲手写过各种功能的代码, 比方封装过数据库訪问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件訪问的类. 封装过UI界面库等. 也在实 ...

  3. WPF学习笔记:获取ListBox的选中项

    有代码有J8: UI <UserControl x:Class="UnitViews.UserListUV" xmlns="http://schemas.micro ...

  4. mysql 常用查询语句记录

    SELECT DISTINCT CONCAT('User: ''',USER,'''@''',HOST,''';') AS QUERY FROM mysql.user; GRANT USAGE ON ...

  5. Android横竖屏切换不重新调用onCreate()

    再次感叹Android的碎片化!!!! 设置AndroidManifest.xml中Activity的android:configChanges=”keyboardHidden|orientation ...

  6. 【POJ 1723】 SOLDIERS

    [题目链接] http://poj.org/problem?id=1723 [算法] 中位数 [代码] #include <algorithm> #include <bitset&g ...

  7. eclipse的快捷键---调试

    1:查看类或接口的方法 Ctrl+T 2:debug调试查看信息 Ctrl+Shift+i 3:debug调试快捷键 (1):F11好像是重新运行debug. (2):F8直接输出结果.(3):F5单 ...

  8. mysql 数据去重

    update ptop_investrecord set delflag = 1 where cid  = 250 and uid = 92569  and delflag = 0 and progr ...

  9. servlet范围:数据共享

    数据共享: 请求转发:request.getDispatcher("相对路径").forward(request,response) 重定向:response.sendRedire ...

  10. Leetcode03---Longest Substring Without Repeating Characters

    Description: Given a string, find the length of the longest substring without repeating characters. ...