C语言中使用逻辑运算符的switch case

7

我是C语言新手,需要帮助。我的代码如下。

 #include<stdio.h>  
 #include<conio.h>  
 void main()
 {

  int suite=2;  

  switch(suite)
     {           
      case 1||2:
      printf("hi");

      case 3:
      printf("byee");

      default:
      printf("hello");
     }

  printf("I thought somebody");
  getche();
  }

我在使用Turbo C,输出结果是helloI thought somebody,没有错误信息。
请告诉我这是如何工作的。

8
你应该见见我的朋友:Enter和Space Bar。如果你礼貌地请求他们,他们真的很棒,可以让你的代码变得更棒。 - Jeff Mercado
@BobKaufman 我只编辑了部分内容 - 其中一部分从未保存。也感谢DaoWen :-) - Aniket Inge
1
如果您解释您的期望和原因,您将获得更多有用的答案。 我可以想到几种不同的方式,这可能不会做您所期望的事情,而且完全有可能您期望完全不同的事情。 如果不知道您期望什么,我们不确定如何解释为什么这样做无法达到您的期望,除非我们猜对了。(您是否希望case 1||2:case 3:一样运作? 或者像“case 1: case 2:`? 还是什么?) - David Schwartz
2
@Er -- 除了格式之外,这是一个很好的第一个问题。一个很好的简短摘录,包括你从中得到的输出和没有错误的提及。我希望每个人都能发表这样好的问题。 - Jeremy J Starcher
@ErAvinashSingh,你有选择的余地,可以在Windows上使用MinGW或Cygwin上的GCC。 - Aniket Inge
显示剩余5条评论
6个回答

15
case 1||2:
成为true,所以变成了case 1:,但传递的值为2,所以执行了默认情况。之后执行您的printf("I thought somebody");

3
解释为什么原帖中的代码没有按照他期望的那样运行,给你点个赞。 - Jeremy J Starcher
嗯,我以为它会像1或2个案例一样工作...但似乎它是在否则情况下工作。 - Er Avinash Singh

8

请执行以下操作:

switch(suite){
  case 1:/*fall through*/
  case 2: 
    printf("Hi");
...
}

这将是一种更加简洁的方法。表达式1||2的计算结果为1,因为的值为2,它既不匹配1也不匹配3,会跳转到default语句。


@JeffMercado 谢谢,我可能会研究一下它们的工作原理。8年C语言编程经验,但仍有许多东西需要学习。 - Aniket Inge
由于C语言中没有布尔类型(它们只是整数),编译器将对1||2进行常量折叠,就像对0+1一样,最终得到的是case 1,而不是用户可能期望的_1或2_,如果他们来自具有完整模式匹配和交替的语言。 - DaoWen
1
啊,是的 @DaoWen 我用我的编译器检查了一下。1 || 2 的值为1,代表真。而且... - Aniket Inge

3
case 1||2:

结果显示

case 1:

因为1 || 2的结果为1(请注意,case语句中只允许使用常量整型表达式,所以无法在一个case语句中检查多个值)。

您应该使用:

case 1:
  // fallthrough
case 2:

1
"1||2" 是一个常量。编译器在某个时刻会将该值降低。很可能是在解析时。 - Jeremy J Starcher
@JeremyJStarcher:我并不是说它不是(而且我在第一个例子中展示了它被简化为什么),我想OP希望1和2的情况相同。然而,再次阅读它,我肯定用了一种令人困惑的方式来表达。我会修复它,谢谢。 - Ed S.
NP。我知道当别人精简我的措辞时我会很喜欢。 - Jeremy J Starcher

0
请记住,在C语言中,switch语句将输入参数与每个指定的case进行比较,并从该case进入switch。然后它会一直执行,直到遇到一个break语句,这在您的代码片段中没有包含。我感觉,使用下面的代码和输入2,您期望看到类似“hi I thought somebody”的输出:
 switch(suite)
 {           
  case 1||2:
  printf("hi");

  case 3:
  printf("byee");

  default:
  printf("hello");
 }

抛开逻辑运算符的问题(上面有很多好的答案),即使这段代码进入了 case 1||2,你的输出也会是“hibyeehelloI thought somebody”。要修复它,只需在每个期望代码执行某些操作的 case 结尾添加一个 break:

 switch(suite)
 {           
  case 1:
  //fallthrough
  case 2:
  printf("hi");
  break;

  case 3:
  printf("byee");
  break;

  default:
  printf("hello");
  break;
 }

0

你在 switch 语句中开启了值为 2 的分支,它匹配了 default 分支,于是先打印出 "hello",然后最后一行打印 "I thought somebody"。


-2
case (1||2):
  printf("hi");

只需加上括号,就能看到神奇的效果。

在您的代码中,程序只检查第一个值并向下执行。由于它在后面没有找到2,因此会进入默认情况。

但是,当您使用括号将两个术语即1和2放在一起时,它会按照所需的方式运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接