switch匹配问题

C和C++中的switch匹配case的问题,记住下面2条原则就行了:

  1. 只有当所有case都不匹配时才会进入default语句
  2. 当找到一个匹配(无论是case还是default)后,会进入下面的case语句,直到找到break才会跳出switch。

我把一个正常的switch的default语句转移到代码的最开始处然后执行代码可以发现问题:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

int main(int argc,char ** argv)
{
    char str;
    //如果输入了一个参数,那么将参数的第一个字符作为switch需要匹配的字符
    if(argc==2)
        str=argv[1][0];
    switch (str)
    {
        default:
                {
                std::cout<<"default"<<std::endl;
                break;
                }

        case ‘a‘:
                {
                std::cout<<"prefix a"<<std::endl;
                break;
                }
        case ‘b‘:
                {
                std::cout<<"prefix b"<<std::endl;
                break;
                }

    }

    return 0;
}

为了验证上面第一点,即只有当所有case不匹配时才会进入default,现在我们把default放在switch语句的最上面,依次执行输入的首字符是a和b,c的情况:

可以发现第一种情况(不输入字符,即str为空)和第四种情况(输入的首字符是c,在switch中找不到匹配的case)没有找到匹配的case,所以进入了default语句,第二种情况和第三种情况找到了匹配的case,没有进入default。这个规则与default在switch的那个地方没有关系。

然后是第二个规则,当找到一个匹配后,无论匹配的是case还是default,都会一直向下执行直到遇到break跳出。这个规则对于匹配case时比较好理解,但是对于进入default时就不是很直观的,还是以上面的代码为例,注释掉default语句里的break,然后运行相同的测试用例:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

int main(int argc,char ** argv)
{
    char str;
    //如果输入了一个参数,那么将参数的第一个字符作为switch需要匹配的字符
    if(argc==2)
        str=argv[1][0];
    switch (str)
    {
        default:
                {
                std::cout<<"default"<<std::endl;
//              break;
                }

        case ‘a‘:
                {
                std::cout<<"prefix a"<<std::endl;
                break;
                }
        case ‘b‘:
                {
                std::cout<<"prefix b"<<std::endl;
                break;
                }

    }

    return 0;
}

运行相同的测试用例的结果如下:

可以发现不输入任何字符和输入字符c即没有任何匹配的case而进入了default后它并没有立即退出switch,而是继续向下执行直到遇到break语句,所以它进入了case为a时的情形,这就是第二条规则。

时间: 2024-11-04 06:35:12

switch匹配问题的相关文章

Long型070000L前面0去掉比较大小,token,mysql innodb,properties,switch匹配空字符串对象

public class TestJava { //定义获取资源文件 private static final ResourceBundle bundle = initBundle(); private static ResourceBundle initBundle(){ return ResourceBundle.getBundle("conf/chinapay", Locale.CHINA); } //键值对 private final static String MERID_U

Swift流程控制之循环语句和判断语句详解

Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代码的另一个点上. 除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历arrays, dictionaries, ranges, strings等其他序列类型. Swift的switch语句也比C语言的要强大很多. Swift中swi

一、PHP基础知识总结

date_default_timezone_set("Asia/Shanghai"); date_default_timezone_set("PRC");//设置时区 PRC 中华人民共和国 Eclipse快捷键: alt+shift+r:重命名 ctrl-/:对一行或多行注释或取消注释 ctrl+o:快速outline ctrl+shift+r:打开资源 屏蔽警告:error_reporting(E_ALL & ~E_NOTICE);// ~ 除了 “se

进击的雨燕---------------控制流

Swift 提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if.guard和switch语句,还有控制流程跳转到其他代码的break和continue语句. 除了 C 语言里面传统的 for 循环,Swift 还增加了for-in循环,用来更简单地遍历数组(array),字典(dictionary),区间(range),字符串(string)和其他序列类型. Swift 的switch语句比 C 语言中更加强大.在 C 语言中

第七章.控制转移语句

控制转移语句 控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转.Swift有四种控制转移语句. continue break fallthrough return 我们将会在下面讨论continue ,break,和fallthrough语句.return语句将会在函数章节讨论. Continue continue告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代.就好像在说“本次循环迭代我已经执行完了”,但是并不会离开整个循环体. 注意:在一个for-condition-in

控制流

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/05_Control_Flow.html 本页包含内容: For 循环 While 循环 条件语句 控制转移语句(Control Transfer Statements) Swift提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他

c++程序的效率优化初涉

能写出稳定高效的程序一直是程序员所追求的,今天就和大家一起探讨一下关于C++程序优化的几点看法. 由于C/C++语言的复杂性,致使C++编译器隐藏了层层幔布,我们不经意的一条语句都可能是编译器幕后几经周折的结果,在要求程序高效运行的环境下,每一条语句都会让我们慎之又慎,而程序优化又是个十分广泛的话题,包括程序架构设计的优化,语言本身的优化,编程技巧和策略等等,如此大的范围非我能力所及,这里谈的优化就是在实际开发中遇到的问题. 一.  举手之劳的小差别 既然说优化就一定要仔细,不放过任何微小的细节

The Swift Programming Language-官方教程精译Swift(6)控制流--Control Flow

Swift提供了类似C语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他代码的break和continue语句. 除了C里面传统的 for 条件递增循环,Swift 还增加了 for-in 循环,用来更简单地遍历数组(array),字典(dictionary),范围(range),字符串(string)和其他序列类型. Swift 的 switch 语句比 C 语言中更加强大.在 C 语言中,如果某个

Welcome to Swift (苹果官方Swift文档初译与注解二十九)---209~218页(第四章-- 流程控制)

Break break语句会立刻结束整个流程控制的执行.break语句可以在switch语句或者循环语句中帮助你提前结束循环或者switch的执行. Break in a Loop Statement  (循环语句中的break) 当在循环语句中使用break,会立刻结束循环的执行,并且跳转到循环体之后的第一行代码.循环不会再遍历执行了. Break in a Switch Statement (switch语句的break) 当在switch语句中使用break,break会立刻结速switc