关于switch-case
声明的一些内容对我来说非常不清楚。首先,我可以将case
部分理解为if
声明,但switch
的作用是什么?我的意思是当我们传递参数切换时,会发生什么?
c=getchar();
switch(c)
2:为什么切换后不需要放;
?这是什么功能?
3:编译器如何在第一时间实现switch-case
语句? (仅C
或使用assembly
)
4:我们不能像这样使用switch-case
:
switch(string)
{
case "aaaa":
...
case "bbbb":
...
我们使用if-strcmp
代替。是否可以为字符串条件创建switch-case
like语句?我看到像getopt
这样的库使用struct来处理命令行字符串参数:
{"help",...,'h'},
{"version",...,'v'}
...
但我想直接使用字符串。
答案 0 :(得分:3)
首先我能理解"案例"部分作为"如果"声明,但是什么剂量开关本身?我的意思是当我们传递参数切换时,会发生什么?
在case
中,始终是一个常数。你需要"比较"这个常数的东西。并且switch(a)
表示 - "将a与:" 进行比较,并且"比较"它发给每个case
声明。
2:为什么没有必要把&#34 ;;"切换后?这是什么功能?
它不是一个功能。您没有调用switch
功能,您只是开始撰写switch
声明。
3:编译器如何在第一时间实现switch-case语句? (只是C或使用组装)
该平台具体。有时候,它是使用jump
s(asm)和抵消来实现的。
4:我们不能像这样使用switch-case:
因为switch
仅适用于整数类型(int
,enum
,char
等,不< / em> double
,字符串等。)
答案 1 :(得分:0)
switch语句开始了案例的范围。 C / C ++中的作用域总是用大括号({}
)绑定,指定用于保存switch参数的局部变量(在堆栈上)的范围。因此它不需要;
,因为它在语法上很像while循环。
编译器将开关实现为装配中的直接跳转。这使得它们比ifs(大多数编译为汇编中的不同比较)更有效。这也是您无法在文本上使用开关的原因。 char*
的值只是一个指针,因此不能用于正确识别要执行的目标部分。
答案 2 :(得分:0)
要在c中切换case()中使用字符串,你可以做的是,将可能的switch字符串存储在字符串中
char * switchstr[]={"abc", "def", "ghi"};
然后在switchstr []中搜索输入字符串,并使用匹配字符串的索引作为switch case参数
并且知道为什么strings are not supported in switch case
阅读此answer。 IT讨论了为什么字符串不能直接用在C / C ++中的switch语句中
并且还要切换大小写检查的相等性,我们知道在C中不能使用=
符号直接检查字符串的相等性,而是需要使用strcmp()函数。
答案 3 :(得分:0)
首先我能理解&#34;案例&#34;部分作为&#34;如果&#34;声明,但是什么剂量开关本身呢?
switch
部分设置用于与关联的case
标签中的值进行比较的表达式。
2:为什么没有必要把&#34 ;;&#34;切换后?这是什么功能?
不是一个功能; switch
是一种语言关键字,是switch
语句的一部分(即整个switch
/ case
结构)。它不仅仅是因为它使用括号而不仅仅是while(...)
或if(...)
是函数。
3:编译器如何在第一时间实现switch-case语句? (只是C或使用组装)
这取决于编译器。 如何实现的内容通常不在语言标准范围内,只能(尽可能精确地)应该发生什么
。实际上,如果只有少量switch
s,则case
语句倾向于使用分支实现,如果有很多,则使用跳转表。
4:我们不能使用switch-case [with strings]
因为 C 将switch
语句定义为使用整数类型。字符串不是整数类型。要提供您设想的功能,需要为字符串 C 语言添加(至少)“内容相等”测试。要以一种不破坏现有代码的方式持续做到这一点可能是不可能的,而且与 C 的“极简主义”哲学背道而驰。