C语言switch case语句中定义变量问题

转载 2017年08月13日 12:20:00

严正声明:
作者:psklf
出处: http://www.cnblogs.com/psklf/p/6702767.html
欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任!

这个问题需要分开讨论,C 语言和 C++ 的标准定义是不同的。
C++

int Caset(int a) {
    switch (a) {
        case 1:
            int b = 1;
            std::cout<<"a==1: "<<b<<std::endl;
            break;
        case 2:
            b = 2;
            std::cout<<"a==2: "<<b<<std::endl;
            break;
    }
}

编译报错信息为

simple.cc:35:9: error: cannot jump from switch statement to this case label
    case 2:
    ^
simple.cc:32:17: note: jump bypasses variable initialization
        int b = 1;
            ^

也就是说,跳到 case2 的这个地方,忽略了对于 b 这个变量的初始化,这个很直观,就是在这里我找不到 b。

那么如果改成

int Caset(int a) {
    switch (a) {
        case 1:
            int b;
            b = 1;
            std::cout<<"a==1: "<<b<<std::endl;
            break;
        case 2:
            b = 2;
            std::cout<<"a==2: "<<b<<std::endl;
            break;
    }
}

顺利成功,没有报错,如果 a 为 2,那么输出 b 也是 2,说明逻辑没有问题。那么问题来了,b 在前面声明,为什么后面可以用到呢,因为 switch-case 的逻辑控制就是用 label 来标记跳转的,而不是别的复杂的逻辑控制,所以 b 的作用域是在整个 switch 的花括号内,关于这个问题见知乎讨论请教switch内部的变量定义问题。
C 语言

上面两种写法统统出错,

void Caset(int a) {
    switch (a) {
        case 1:
            /* one style */
            int b;
            b = 1;

            /* another style */
            int b = 1;

            printf("1: %d", b);
            break;
        case 2:
            b = 2;
            printf("2: %d", b);
            break;
    }
}

两种写法都错,报错信息:

main.c:12:13: error: expected expression
    int b; 
    ^
main.c:13:13: error: use of undeclared identifier 'b'
    b = 1;
    ^

意思是说,此处需要一个表达式(expression),而不是一个变量声明初始化。有一个很黑客的做法,如下:

void Caset(int a) {
    switch (a) {
        case 1:
            ; 
            int b = 1;
            // b = 1;

            printf("1: %d \n", b);
            break;
        case 2:
            b = 2;
            printf("2: %d \n", b);
            break;
    }
}

这个很不能理解了,其实也就是说保证 case 后面跟着的确实是 expression 即可。考虑一下 C++ 代码出现的问题:跳过变量的声明?C 语言中同样跳过,但是编译器不认为这个是错误,而且逻辑上面也是没有问题的,在后面的 case 中可以正常给变量赋值,但是如果 case2 中,我不是给 b 赋值,而是直接访问 b,那返回的数值就是一个随机的错误的数据了,我在我的电脑上使用 gcc 编译,若直接读取数据,得到的是 0,当然编译通过,连警告都没有。

当然我认为这样的代码可读性差,比较好的做法可以是将声明变量的事情放在头上做。

void Caset(int a) {
    switch (a) {
        int b;
        case 1:
            b = 1;
            // b = 1;
            printf("1: %d \n", b);
            break;
        case 2:
            b = 2;
            printf("2: %d \n", b);
            break;
    }
}

但是要留心, switch 和 case 之前那块地方也就只能写写这样的声明,写别的表达式,赋值啊什么的,统统是不会生效的。

switch case 语句内部变量定义

switch case语句是非常常用的语句,入门的码农也知道是做什么的。 但关于switch case内定义变量的问题,网上的很多博文都有谬误,在这里我写一下对这个语句的了解。 一 先看合...
  • neuwyt
  • neuwyt
  • 2015年10月08日 08:27
  • 2819

基于proteus的51单片机仿真实例二十九、C语言的switch-case多分支选择语句

本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。...

小朋友学C语言(29):switch case语句

switch case语句与if elseif语句类似,都是从多个选择条件里选取一个来执行。(一)先来看一个if elseif程序#include int main() { int numb...

【学习ios之路:C语言】布尔类型,关系运算符、逻辑运算符、if 、switch..case.语句

1.布尔类型     BOOL是一种表示非真即假的数据类型,存储YES(1)和NO(0)两个值       BOOL a = YES; printf("%d\n" , a...
  • ZFX5130
  • ZFX5130
  • 2014年12月07日 18:54
  • 1047

C语言中switch case语句的实现

原文在这里:http://blog.csdn.net/ts_54eagle/article/details/5278465 在程序中我们经常用到switch case,它的用法就不再用多说了。计...

sql语言中有没有类似C语言中的switch case的语句??

没有,用case   when   来代替就行了.              例如,下面的语句显示中文年月         select   getdate()   as   日期,cas...

黑马程序员-C语言的SWITCH 和case问题

#include #include int main() {     char a[100];     printf("请输入一串字符:");     scanf("%s",a);   ...

定义一个结构体变量(包括年、月、日),编写程序,要求输入年月日,程序能够计算并输出改日是本年中的第几天。注意闰年问题。(switch语句)

// 121212 第七章习题1.cpp : 定义控制台应用程序的入口点。 // /* * Copyright (c) 2012, 烟台大学计算机学院 * All...

C语言:Switch语句解决实际问题

任务代码: #include #define PRICE 12//此处以千千快递为例,每千克货物运费12RMB,定义常量宏 int main ( ) { float fWeight,fDi...
  • Zzwtyds
  • Zzwtyds
  • 2017年07月03日 10:50
  • 209

第二周《C语言及程序设计》实践项目26 利用switch语句解决问题

【项目1:投票表决器】 /* * Copyright (c) 2016, CSDN学院 * All rights reserved. * 文件名称:【项目1:投票表决器】.cpp * ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言switch case语句中定义变量问题
举报原因:
原因补充:

(最多只允许输入30个字)