C语言中的switch语句,case后面可不可以跟一表达式,例如“100>x>50”;如不可以为什么?

如题所述

不可以,C语言中的switch case中的case后面仅可以跟整形常量或常量表达式

原因:如果case后面跟 100>x>50是会出现逻辑错误的。

首先C语言中像100>x>50这种表达式的意义并不和数学里的一样表示x落在(50,100)这个区间。这个在C语言中100>x会先被计算得到真或假。直接用关系运算得到的真和假在C语言中就是1或0。而1或0是始终小于50的。这就导致这个表达式的值永远为零。

常量表达式:在计算机编程语言中,若一个表达式的值不能发生改变,则称之为常量表达式,如C++中有整型常量,字符常量,逻辑常量,实型常量,地址常量,符号常量,这些常量组成的表达式即为常数表达式。其中含有字符常量的常量表达式可称为字符常量表达式。

整型常量:整型常量就是通常的整数,包括正整数、负整数和0,其数据类型显然是整型。除此之外,整型常量包括短整型、长整型和无符号型等不同类型。

扩展资料

switch语句的用法和特点:

switch的用法是判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break。

Switch case 语句表达式为:

switch{case 常量1: 语句体1;case 常量2: 语句体2;case 常量3: 语句体3;case 常量4: 语句体4;....default : 语句体;}

当常量表达式所表达的量与其中一个case语句中的常量相符时,就执行此case语句后面的语句,并依次下去执行后面所有case语句中的语句,除非遇到break;语句跳出switch语句为止。如果常量表达式的量与所有case语句的常量都不相符,就执行default语句中的语句并跳出switch语句。

switch ...  case语句的特点:

1、把要讨论的表达式与case后面的常量进行比较,发现匹配项之后,从该位置入口,做它下面的所有语句。

2、case 后面的常量不能重复

3、可以在每一个case语句的后面加上break语句,这样就能保证只做与之相匹配的那一项。

4、break实质:在switch ...case语句里面最先遇到那一个break就从该位置结束该语句

5、可以在最后一个case的下面加上default语句表示如果找不到匹配项时,就做default对应的项。

6、default并不是一定要有,如果前面遇到break,default就不执行。如果没有遇到break,就一定会执行。

7、case后面的语句可以不执行,表示与下一个case是或的关系。

参考资料:百度百科-switch

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-09

不可以,C语言中的switch case中的case后面仅可以跟整数常量或常量表达式。

在C语言创始人K&R 《The Programming C》第二版一书中的72页指出:Each case is labeled by one or more integer-valued constants or constant expressions. 即:每个case被一个或多个整数型常量或常量表达式标注。

如果case后面跟 100>x>50是会出现逻辑错误的。首先C语言中像100>x>50这种表达式的意义并不和数学里的一样表示x落在(50,100)这个区间。这个在C语言中100>x会先被计算(C语言运算符中的结合性)得到真或假。直接用关系运算得到的真和假在C语言中就是1或0。而1或0是始终小于50的。这就导致这个表达式的值永远为零。

这样就会产生一个问题。之前说case后面只能跟常量。所以编译时编译器会检查case后面是不是常量。如果case后面跟一个100>x>50,这个表达式始终为零。在编译阶段就会被优化成0。这就是一个常量,所以编译不会报错。但代码就会变成匹配switch后面的表达式等于0时的情况。

但如果表达式改为100>x>0就会报:case label does not reduce to an integer constant。标签无法化简为整数,也就是case后面不是常量了。因为100>x是0或1,0或1大不大于0是不确定的,是一个变量!所以报错。无论编译通过与否,case后面跟一个像100>x>50这样的表达式都与原来要达到的目的相去甚远。

所以说在C语言中如果你要使用case作范围判断就比较麻烦,比如要判断90>x>100就要先把x整除10,然后case再匹配9就可以曲线救国。但是这样太麻烦,代码也不易读。建议使用if-else语句来代替。switch-case用来匹配常量就好了。

扩展资料:

switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:

1. 只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。

2. switch()的参数类型不能为实型 。

3. case标签必须是常量表达式(constantExpression),如42或者'4'。

4. case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值。

参考资料来源:百度百科-switch关键字

参考资料来源:百度百科-C语言运算符

本回答被网友采纳
第2个回答  2019-12-07

不能,case后面是常量表达式

要注意 CASE 表达式里各个分支返回的数据类型是否一致。某个分支返回字符型,而其他分支返回数值型的写法是不正确的。

使用 CASE 表达式的时候,最容易出现的语法错误是忘记写 END 。虽然忘记写时程序会返回比较容易理解的错误消息,不算多么致命的错误。而执行时却出错的情况大多是由这个原因引起的。

CASE表达式的执行结果是 NULL 。但是不写可能会造成"语法没有错误,结果却不对"这种不易追查原因的麻烦,所以写上 ELSE 子句(即便是在结果可以为 NULL 的情况下)。

扩展资料

1、CASE表达式的真假值判断就会中止,而剩余的 WHEN子句会被忽略。为了避免引起不必要的混乱,使用 WHEN子句时要注意条件的排他性

2、当case后的表达式的值与switch表达式的值相等时, 即执行对应case后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

本回答被网友采纳
第3个回答  推荐于2017-11-28
switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:   只能针对基本数据类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。   case标签必须是常量表达式(constantExpression),如42或者"42"。如果需要在运行时计算case标签的值,必须使用if语句。   case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值。   C语言switch应用例子:   例一:   #include<stdio.h>   int main()   {   double score;   printf("请输入分数:\n");   scanf("%lf",&score);   switch((int)(score/10))//switch((int)score/10)出现严重错误   {   case 10:   case 9:printf("A(最好)\n");break;   case 8:printf("B(优秀)\n");break;   case 7:printf("C(良好)\n");break;   case 6:printf("D(及格)\n");break;   case 5:   case 4:   case 3:   case 2:   case 1:   case 0:printf("E(不及格)\n");break;   default:printf("Error!\n");   }   } 像你的50<x<100 非要用case可以定义一个就是a,a=x/50 整除。然后在case里面列举。本回答被网友采纳
第4个回答  2013-07-12
不可以,case后面需要跟一个常量。如果你想要实现以范围区分,可以使用多个if语句来实现。
相似回答