c语言中CASE 问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中CASE 问题?相关的知识,希望对你有一定的参考价值。

列题如下:
# include <stdio.h>
int main()
int a=0,b=2,c=3;
switch(a)

case 0:switch(b==2)
case 1:printf("*");break;
case 2:printf("%");break;
case 3:printf("#");

case 1:switch(c)
case 1:printf("$");break;
case 2:printf("&");break;
default:printf("@");


return 0;


想问a=0,选择case 0的情况,为什么还会进入 下面的CASE 1中输出@???

不要把case当成if。
如果它具有if功能,显然就不会出现选择了case 0还会进入case 1的情况,也就没有必要使用break语句。
case可理解为一个纯粹的入口,没有任何判断功能,所以在进入一个入口后,还可以依次进入下一个入口,除非使用break语句跳转至结束(break相当于一个goto语句)。
在编译阶段,编译器会正确计算每一个case入口与switch语句之间的距离,生成一个跳转表(也可能是一个计算距离的公式,总之就是等价的东西),当知道a的值后,直接用跳转表中相应项跳转到正确的入口,避免了if判断,因此速度很快
参考技术A case 0:switch(b==2)
case 1:printf("*");break;
case 2:printf("%");break;
case 3:printf("#");

case 0 后面没有break,所以继续往下执行本回答被提问者采纳

shell中case语句程序传参while

2.2.6.1、case语句
(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异
(2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同。shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break)。

2.2.6.2、调用shell程序的传参
(1)C语言中可以通过main函数的argc和argv给程序传参(详情参考《4.8.3.argc、argv与main函数的传参》)
(2)shell程序本身也可以在调用时传参给他。在shell程序内部使用传参也是使用的一些特定符号来表示的,包括:
$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
$0、$1、$2·····则依次表示传参的各个参数。

C语言:./a.out aa bb cc  argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····

shell:source a.sh aa bb cc  $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值·····

注意:shell中的很多语法特性和C语言中是相同的,也有很多是不同的。所以大家学的越多越容易混淆(本质原因还是用的不熟悉,用的少),解决方案是:做笔记、作总结、多写代码经常用

2.2.6.3、while循环和case语言和传参结合
(1)shell中的break关键字和C语言中意义相同(都是跳出)但是用法不同。因为shell中case语句默认不用break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,case中的break是跳出外层的while循环的,不是用来跳出case语句的。
(2)shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的$#少了1个。

以上是关于c语言中CASE 问题?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中case的意思和用法

c语言中CASE 问题?

c语言中while 、for、switch、case的用法?

c语言中GetFieldValue()参数问题

C语言中字符统计问题

c语言case