请教下,c语言的switch里可以这样写吗?
swich(x)
{
case 1:
break;
case 2:
break;
if(y == 1)
{
case 3:
break;
}
default:
break;
}
离线
哪有这样玩的
离线
可以,但是永远不会执行,没有意义!
离线
谢谢两位。
离线
额................
有什么不同吗?
case xx:
if(xxx)
{
}
break;
离线
没见过这样写的...
离线
不能,语法错误。写个小程序验证一下就知道了。
离线
语法错误
离线
C语言甚至可以在switch里套循环。
switch(c) {
while(--i) {
case 0:
case 1:
break;
default:
}
}
最近编辑记录 Fomalhaut (2022-12-28 11:45:41)
离线
先说结论:这样做没有语法错误,但很可能达不到楼主想要的效果,除非明确自己需要做什么,否则不建议这么写。
具体代码的编译结果可以参考这个: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的功能实际上很简单,说起来就是:
首先计算switch内的表达式的值,C要求计算的结果必须为整数(即integer)。
接下来会找到值匹配的case,如果没有匹配的值则会跳转到default(如果有),如果没有则直接跳出整个switch。由于C语言限制了case值不能重复,也不能有多个default标签,所以从switch到case/default的跳转是唯一的。
跳转到相应位置后,依次执行代码,直到遇到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.
离线