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

浅谈车联网概述-1 车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。 阅读详情

严正声明:
作者: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 之前那块地方也就只能写写这样的声明,写别的表达式,赋值啊什么的,统统是不会生效的。

华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go) 华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。 阅读详情

相关推荐

突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码)

本文详细介绍了如何利用Python与GIS技术实现高斯烟团模型,用于模拟化工泄漏等突发环境事件的动态扩散过程。通过核心原理讲解、参数快速获取方案、Python代码实现及GIS可视化集成,为环境应急人员提供了一套完整的解决方案。特别适合危险品运输事故等瞬态污染场景的应急决策支持。

weixin_33692284的博客 486

switch case 语句内部变量定义

switch case语句是非常常用的语句,入门的码农也知道是做什么的。 但关于switch case内定义变量的问题,网上的很多博文都有谬误,在这里我写一下对这个语句的了解。 一 先看合法的定义方式: int main(int argc, const char * argv[]) {    int idx = 2;    switch (idx) {

Yuting's Blog 1万+

别再手动调参数了!用3ds Max的tyDiffusion插件,5分钟搞定AI动态纹理生成

本文介绍了3ds Max的tyDiffusion插件如何通过AI技术快速生成动态纹理,大幅提升3D美术师的工作效率。从火焰、水流到布料飘动,tyDiffusion能在5分钟内完成传统手工需要数小时的任务,且效果更自然。文章详细解析了插件的核心功能、实战配置及进阶应用,帮助用户轻松实现AI动态纹理生成。

weixin_30919429的博客 672

switch-case语句里的一些注意事项

switch-case语句里的一些注意事项: 在switch-case语句里,在case这一层可以声明变量,但不能初始化; 解决方法: 在case外面先声明初始化完,再在case里使用。 用if-else来代替switch。 case后面加上{}。//(由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间 也就是整个switch语句,其他的case语句也能看到,这..

weixin_61456633的博客 2538

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1497

c语言, switch语句的case分段中,第一行不允许定义变量(未解决)

我发现,switch语句的case分段里,第一行不能定义变量 switch (a) { case 1: int b = 0;//visual studio2019会报错 break; } 网上查了查,他们说case分段中定义的变量,在整个switch中都是可见的,为了避免类似下面这种情况: switch (a) { case 1: int b;//没有初始化 break; case 2: printf("%d\n", b);//调用了没有初始化的b break; } 他们说解决方法...

KZZWAN的博客 800

基于单片机的自动喷淋系统设计【毕业设计】

随着人民生活质量提高与生活节奏的加快,城市居民对于花草绿植的家庭培养与装饰需求增加,随之因浇灌植物的需要,智能浇花系统的市场逐渐扩大。现有自动浇花系统大部分只能通过设置固定浇水时间而难以实现适时、适量浇水,或在植物环境土壤含水量低时进行报警而并不能实际补水。为克服局限性而设计以单片机为控制中心的自动浇花系统。通过湿度传感器检测目标植物环境土壤湿度数据,再经ADCO832将其放大转换为数字量,由单片机读取输出向LCD1602 显示屏显示并通过比对键盘向单片机所设置的湿度范围而利用中断服务程序进行补水需求判断。

qq_48771816的博客 1712

c语言case两个变量的组合,我可以使用带有两个变量的case/switch语句吗?

DashK..21一个按位运算符怎么样?而不是字符串,你处理"enums",看起来更"优雅".// Declare slider's state "enum"var SliderOne = {A: 1,B: 2,C: 4,D: 8,E: 16};var SliderTwo = {A: 32,B: 64,C: 128,D: 256,E: 512};// Set statevar s1 = Slide...

weixin_30269407的博客 950

基于Multisim的模电调幅发射机仿真设计

振荡器产生的高频信号的功率很小,所以有必要对高频信号进行功率放大,有利于信号的调制发射。缓冲电路将主振荡器和高频功放电路相隔离,以减小功放电路对主振荡器的影响。缓冲电路可以用射极跟随器电路来实现,其作用就是前后级的阻抗相互匹配,减小前后级的影响。总电路的仿真结果见下图:示波器1~4分别是主振荡器、缓冲电路、高频放大电路和调幅电路的输出波形。由于载波频率稳定度≤10-3,所以可以采用并联型改进电容反馈式三端振荡器(Seiler电路)谐振回路,滤除其他频率的成分,得到与载波(假设。(1)缓冲电路的设计与实现。

Eve223322的博客 4593

基础矩阵、本质矩阵、单应矩阵

基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

Gloamirror的博客 1330

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

今天在完善通讯录项目的时候发现一个小问题,就是在switch case 语句中定义变量时会报错,出现下面的问题 函数中当时我是这样写的 问题处在哪里呢?很简单,大家看下面的例子 switch(num){ case 1: int a = 1; case 2: printf("hello world\n");...

IT_xiaoye的博客 1万+

24届数字IC验证——SV+UVM基础知识汇总(一)

汇总整理在面试过程中常见的问题,如果都能回答下来,那么面试肯定不成问题的分别构建不同抽象级的transaction,来实现复杂的激励。(以前是单一层次的sequence,对激励复用、上层复用不塌友好)不同层级之间的sequence没有继承关系,相互之间进行转换低层次的sequence从高层次的sequencer中获取高层次的sequence,并将其转换为低层次的sequence,再通过低层次的sequencer发送出去如何连接:低层次的sequencer包含高层次sequencer的句柄。

qq_42135020的博客 3152

switch case中变量定义问题

今天在编写C代码的时候,碰到了一个以前没有碰到过的switch case语句中定义变量出错问题。 问题大概是这样的,看下面这个代码,它在case中定义了一个变量,然后报错了: #include<stdio.h> int main(int argc, char const *argv[]) { int a = 1; switch(a) { case 0: int m...

hhhhhyyyyy8的博客 3044

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言switch()变量,如何在switch case中定义变量(不用花括号)

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森!天天考了我一个问题,在C语言里面,如何在switch case中定义一个变量?要求是不用花括号。这个问题是背景是,下面的代码是编译不过的,因为在case后面不能直接定义变量。switch(v){case1:inta;get_value_of_xx(&a);set_yy(a);break;cas...

weixin_30675619的博客 1762

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

switch中case中变量定义的问题

今天写C代码时在case中定义了变量变异处错误,代码如下 #include int main() { int n; scanf("%d", &n); switch(n){ case 0: printf("it's 0\n"); break; case 1: int i = 2; printf("it's 1, i =

gqqh040930218的专栏 2936

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

怎么在c语言里case后加变量,如何在switch case中定义变量(不用花括号)

这个周末有幸见到了几位神交已久的库友(每天/迪迪/丁丁),你们一块儿扯了些有的没的,很开森!express每天考了我一个问题,在C语言里面,如何在switch case中定义一个变量?要求是不用花括号。ide这个问题是背景是,下面的代码是编译不过的,由于在case后面不能直接定义变量。学习switch(v){case1:inta;get_value_of_xx(&a);set_yy...

weixin_29696451的博客 2925

C语言中switch语句的case标签问题

本文将详细解析一个典型的错误案例,并给出解决方案。如果你有任何问题或建议,欢迎在评论区留言!如果不需要类型检查,可以使用 #define 定义常量。语句是一种常用的多分支选择结构。语句时,可能会遇到一些常见的错误,尤其是与。如果需要一个命名常量,可以使用。标签不能是一个变量,而必须是一个。变量并不被视为编译时常量。标签必须是编译时常量表达式。变量虽然不可修改,但并不满足。希望这篇博客对你理解C语言中。,因为枚举值是编译时常量。,可以有效地解决这个问题。#define 宏定义。

2401_89274644的博客 679

c语言switch函数case括号,如何在switch case中定义变量(不用花括号)

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森!天天考了我一个问题,在C语言里面,如何在switch case中定义一个变量?要求是不用花括号。这个问题是背景是,下面的代码是编译不过的,因为在case后面不能直接定义变量。switch(v){case1:inta;get_value_of_xx(&a);set_yy(a);break;cas...

weixin_36326008的博客 828

switch c语言讲解,C语言switch使用之诡异用法详解

关于switch的用法这里不再做什么总结了,其实这个是一个便捷的快速跳转条件切换器。而关于这个功能最常用的技术讨论点在于case后面的break以及default。这里不讨论这些,直接看下面的代码:#include"stdio.h"int main(void){int num = 0;switch(num){printf("functionrun!\n");}return 0;}上面的代码中用到了...

weixin_36012152的博客 276

关于C语言中switch的case里定义变量解决编译报错

时间紧促,粗糙记录一下! 一: case 1: int a; break; case 2: ...... 二: case 1: char *p = malloc(......); ....... case 2: ...... 像一那样在case里面直接定义变量时,编译器一般是会报错的,应该改为如下,以表示是在{}的范围内有效的变量 case 1: { int

ycc541的专栏 2333

在case中定义变量

今天在写C语言的测试程序的时候, 遇到一个很头痛的问题. 我想在case中定义一个结构体变量, 但是发现编译器报错.经过各种改动都没有效果.最后只能更改思路, 在switch语句外面定义变量, 虽然最后也完成了功能. 但是不开心. 回过头来, 我翻看了课堂笔记, 在switch...case语句中定义变量, 需要加{     } . 那么, 为什么呢? 我赶紧区百度了一下. 原来​:

gaoxiaodong123的博客 468

C语言switch case怎么用?核心原理与常见陷阱解析

在C语言中,switch case语句是处理多分支选择的有力工具。它通过匹配一个表达式的值,跳转到对应的case标签执行代码,其结构清晰,常常比一连串的if-

2509_93883384的博客 288

编译错误 jump to case label [-fpermissive]

switch case 语句中,在case里定义变量就会出现这种编译错误;原因是编译器认为这种写法会错过变量的定义,就报错;解决方法:将变量的定义移出switch case;总结:不要在if或case下定义变量;

xianxjm的博客 5万+

《c专家编程》第5部分 语句与控制结构

{}

qq_40844444的博客 1101

GCC中的switch case语句

标准C中,switch case语句中的case后面可以不用大括弧(如VC6),但是在GCC中,case后面如果定义了临时变量,就一定要使用大括弧,否则会报错。 在gcc-3.3.4中会报"syntax error before xxxx",这使得问题很难定位,错误信息不够明确,并且网络搜索很难定位关键字查找答案,在gcc-4.4.3中,报错信息得到了明...

weixin_34197488的博客 336
上一篇: 求1+2+....+n
下一篇: 不用加减乘除做加法
Findway_
博客等级 码龄10年 36粉丝 117原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值