为什么我的代码使用逻辑表达式作为案例标签会引发错误?

时间:2017-06-19 10:00:45

标签: c switch-statement

switch(at){
case (at>0 && at<5) :
        printf("Average Time Taken (Hrs)\n%d.0",at);
        printf("Your Salary is Rs.%d",pj*1500 + 5000);
        break;

其余代码类似。我收到case (at>0 && at<5) :

的错误

2 个答案:

答案 0 :(得分:10)

我担心这是不可能的。引用C11,章节§6.8.4.2

  

每个case标签的表达式应为整数常量表达式,而不是两个   同一switch语句中的大小写常量表达式应具有相同的值   转换后。 [....]

因此case标签表达式不能是运行时生成的值依赖。

您可以使用直通式语法来实现您想要的效果,例如

switch(at){
case 1:
case 2:
case 3:
case 4:
        printf("Average Time Taken (Hrs)\n%d.0",at);
        printf("Your Salary is Rs.%d",pj*1500 + 5000);
        break;

  //some other case

否则,如果您使用gcc扩展程序即可,则可以使用 case-range syntax ,例如

switch(at){
case 1 ... 4:
        printf("Average Time Taken (Hrs)\n%d.0",at);
        printf("Your Salary is Rs.%d",pj*1500 + 5000);
        break;

答案 1 :(得分:4)

switch语句中的case值必须是编译时常量(例如文字,或静态const,或#define到其中之一)。对于您要做的事情,您需要一个else if链:

if (0 < at && at < 5) {
    printf("Average Time Taken (Hrs)\n%d.0",at);
    printf("Your Salary is Rs.%d",pj*1500 + 5000);
} else if (5 <= at && at < 10) {
    // Your code here

请注意,我已将参数反转到第一个比较(和方向)。如果您对同一个变量进行了多次比较,我发现如果它们都在同一个方向上会更容易阅读。