您尚未登录。

楼主 # 2022-08-04 16:35:19

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

请教,c语言里的switch里,可以if语句里再加case吗?

请教下,c语言的switch里可以这样写吗?

swich(x)
{
    case 1:
        break;
    case 2:
        break;
    if(y == 1)
    {
        case 3:
            break;
    }
    default:
        break;
}

离线

#1 2022-08-05 12:43:54

lanlanzhilian
会员
注册时间: 2021-12-21
已发帖子: 130
积分: 50

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

哪有这样玩的

离线

#2 2022-08-05 13:19:40

dykxjh
会员
注册时间: 2020-03-25
已发帖子: 170
积分: 165

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

可以,但是永远不会执行,没有意义!

离线

楼主 #3 2022-08-05 14:37:06

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

谢谢两位。

离线

#4 2022-08-19 16:36:43

gaocangjian
会员
注册时间: 2022-08-08
已发帖子: 32
积分: 39

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

额................
有什么不同吗?
case xx:
      if(xxx)
      {
     
      }
break;

离线

#5 2022-12-16 01:23:20

Jome
会员
注册时间: 2022-12-16
已发帖子: 3
积分: 3

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

没见过这样写的...

离线

#6 2022-12-16 08:38:19

davidxu
会员
注册时间: 2021-04-13
已发帖子: 12
积分: 2

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

不能,语法错误。写个小程序验证一下就知道了。

离线

#7 2022-12-27 17:46:02

OrangePeel
会员
注册时间: 2022-12-27
已发帖子: 1
积分: 1

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

语法错误

离线

#8 2022-12-28 09:29:50

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

davidxu 说:

不能,语法错误。写个小程序验证一下就知道了。

没有语法错误……

离线

#9 2022-12-28 11:36:50

Fomalhaut
会员
注册时间: 2021-10-28
已发帖子: 36
积分: 31

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

C语言甚至可以在switch里套循环。

switch(c) {
    while(--i) {
        case 0:
        case 1:
           break;
        default:
    }
}

最近编辑记录 Fomalhaut (2022-12-28 11:45:41)

离线

#10 2022-12-28 12:38:47

metro
会员
注册时间: 2019-03-09
已发帖子: 445
积分: 489

Re: 请教,c语言里的switch里,可以if语句里再加case吗?

先说结论:这样做没有语法错误,但很可能达不到楼主想要的效果,除非明确自己需要做什么,否则不建议这么写。
具体代码的编译结果可以参考这个:https://godbolt.org/z/57EfcK7eM(为了避免编译器的优化,对case值进行了少许修改)。

接下来说说C语言里面switch和case的逻辑,可以参考C语言的规范,例如C99:https://www.dii.uchile.cl/~daespino/files/Iso_C_1999_definition.pdf
可以看到,C里面的switch的功能实际上很简单,说起来就是:

  1. 首先计算switch内的表达式的值,C要求计算的结果必须为整数(即integer)。

  2. 接下来会找到值匹配的case,如果没有匹配的值则会跳转到default(如果有),如果没有则直接跳出整个switch。由于C语言限制了case值不能重复,也不能有多个default标签,所以从switch到case/default的跳转是唯一的。

  3. 跳转到相应位置后,依次执行代码,直到遇到break提前终止或者完成整个switch。

至于case,其实case可以理解成是一种带常数表达式的label(也就是goto跳转到的地方),因此case可以出现在switch内的任何位置,但这个位置是直接跳转过去的,并不会去执行前面的语句。以楼主给的代码为例,这里if(y==1)实际上就是永远不会执行到的代码,因为上一个case结束时有break,而下一个case是在if语句里面,从执行的结果上看相当于没有这一行代码。现在,对比上面给的编译结果,应该就很容易理解为啥完全没有出现r1(第二个参数)这个寄存器了。

最后贴一个C99规范里面的例子,以及相应的说明:

In the artificial program fragment

switch (expr)
{
	int i = 4;
	f(i);
case 0:
	i = 17;
	/* falls through into default code */
default:
	printf("%d\n", i);
}

the object whose identifier is i exists with automatic storage duration (within the block) but is never initialized, and thus if the controlling expression has a nonzero value, the call to the printf function will access an indeterminate value. Similarly, the call to the function f cannot be reached.

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn