关于switch-case的一些不清楚的事情

时间:2014-03-18 14:39:12

标签: c switch-statement

关于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'}
...

但我想直接使用字符串。

4 个答案:

答案 0 :(得分:3)

  

首先我能理解"案例"部分作为"如果"声明,但是什么剂量开关本身?我的意思是当我们传递参数切换时,会发生什么?

case中,始终是一个常数。你需要"比较"这个常数的东西。并且switch(a)表示 - "将a与:" 进行比较,并且"比较"它发给每个case声明。


  

2:为什么没有必要把&#34 ;;"切换后?这是什么功能?

它不是一个功能。您没有调用switch功能,您只是开始撰写switch声明。


  

3:编译器如何在第一时间实现switch-case语句? (只是C或使用组装)

该平台具体。有时候,它是使用jump s(asm)和抵消来实现的。


  

4:我们不能像这样使用switch-case:

因为switch仅适用于整数类型(intenumchar等,不< / 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 的“极简主义”哲学背道而驰。