zoukankan      html  css  js  c++  java
  • c/c++排坑(3) -- c/c++中的switch语句

    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

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

    See you next time. Happy Coding!!!
    我的github

  • 相关阅读:
    hdu6354 杭电第五场 Everything Has Changed 计算几何
    hdu6351 Beautiful Now 杭电第五场 暴力枚举
    牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
    百度之星资格赛 调查问卷 bitset模板(直接将字符串转化成二进制数组并可以计算出十进制值)
    百度之星资格赛 子串查询 线段树
    牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组
    牛客多校第五场 E room 二分图匹配 KM算法模板
    牛客第五场多校 J plan 思维
    idhttp提交post
    centos6.2 shutdown now关机进入单用户模式
  • 原文地址:https://www.cnblogs.com/dnhua/p/10091771.html
Copyright © 2011-2022 走看看