C 为什么我使用逻辑表达式作为案例标签的代码会抛出错误? 开关(at){ 案例(at>0和&at

C 为什么我使用逻辑表达式作为案例标签的代码会抛出错误? 开关(at){ 案例(at>0和&at,c,switch-statement,C,Switch Statement,恐怕这是不可能的。引用C11,第§6.8.4.2章 每个案例标签的表达式应为整数常量表达式,且不得有两个 同一开关语句中的case常量表达式应具有相同的值 转换后。[……] 因此,case标签表达式不能依赖于运行时生成的值 您可以使用一个完整的语法来实现您想要的,比如 switch(at){ case (at>0 && at<5) : printf("Average Time Taken (Hrs)\n%d.0",at); printf

恐怕这是不可能的。引用
C11
,第§6.8.4.2章

每个
案例
标签的表达式应为整数常量表达式,且不得有两个 同一
开关
语句中的case常量表达式应具有相同的值
转换后。[……]

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

您可以使用一个完整的语法来实现您想要的,比如

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;
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
扩展,您可以使用,类似于

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;
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

switch语句中的case值必须是编译时常量(如literal、static const或其中一个的#define)

switch(at){
case 1 ... 4:
        printf("Average Time Taken (Hrs)\n%d.0",at);
        printf("Your Salary is Rs.%d",pj*1500 + 5000);
        break;
if(0}否则如果(5不,这是不可能的。这是胡说八道。烧掉你认为这会编译的那本书。取而代之的是:一个
if
语句。@StoryTeller这是不可能的,但它实际上是有意义的,因为如果我们可以在开关中包含表达式,这将是一个很好的功能。@SembeiNorimaki然后它就失去了用途。开关案例w然后,您将生成与if-elseif-else梯形图完全相同的代码。另一方面,仅使用常量表达式的开关大小写允许跳转表和其他优化。
case
表达式是编译时整数。您的表达式不是。编译错误将被打印,而不是“抛出”。异常将被抛出。