它在标有双正斜杠的所有位置都有相同的语法错误,语法错误是“大小写标签不会减少为整数常量”
我不能使用if语句,因为我的书很愚蠢而且讨厌if语句(但仅在switch语句章节中)
#include <stdio.h>
int main()
{
double price;
int power;
char user,hrs;
printf("Enter what kind of consumer (R for residential, C for commercial, I for industrial): ");
scanf("%c",user);
printf("Enter amount of kilowatt hours used: ");
scanf("%d",power);
switch(user)
{
case 'R':
case 'r':
price=6.00+.052*power;
break;
case 'C':
case 'c':
switch(power)
{
case (power>1000): //
price=60.00+(power-1000)*.045;
case power<=1000: //
price=60.00;
}
break;
case 'I':
case 'i':
{
printf("Hours (P for peak, O for off-peak):");
scanf("%c",hrs);
switch(hrs)
{
case 'P':
case 'p':
switch(power)
{
case power>1000: //
price=76.00+.065*(power-1000);
break;
case power<=1000: //
price=76.00;
break;
}
case 'O':
case 'o':
switch(power)
{
case power>1000: //
price=40.00+.028*(power-1000);
break;
case power<=1000: //
price=40.00;
break;
}
break;
default:
printf("Business hour ID not recognized; try again");
break;
}
}
break;
default:
printf("Consumer ID not recognized; try again");
break;
}
printf("Price is %f", price);
return(0);
}
你的case
语句中的表达式必须是'p'
之类的常量,而不是像power>1000
这样的表达式。
如果你需要做像power>1000
这样的表达式,你应该使用if
/ else
结构来处理所有适当的情况。
case语句的值必须是常量整数。
您可以自由使用字符(例如'a','x'等),因为它们将由编译器(使用其ASCII代码)转换为整数。
使用任何其他类型的常量将产生意外的并且可能令人不愉快的结果。
此外,如果在两个不同的case语句中使用相同的值,编译器会抱怨(并且正确)。这可能比看起来更棘手。例如 :
#define WHATEVER 1
switch (xxx)
{
case 1 : return 1;
case WHATEVER : return 10; // error: duplicate case value
}
坦率地说,我认为你的练习不能很好地说明案例陈述的实际用法。
99%的情况下,案例值将来自枚举类型,例如:
typedef enum {
CMD_START,
CMD_STOP
} Command;
function process_command (Command c)
{
switch (c)
{
case CMD_START:
do_start();
break;
case CMD_STOP:
do_stop();
break;
default:
panic ("unknown command %d", c);
}
}
当你在switch
上power
时,case
目标必须是常数。
由于您实际上只对power>1000
的二进制结果感兴趣,您可以将switch
应用于:
switch(power>1000)
{
case 1:
price=76.00+.065*(power-1000);
break;
default:
price=76.00;
break;
}
练习是为了让你明白使用switch
这种方式非常接近if
-else
。但是,这只是为了满足学术活动。实际上没有人愿意维护以这种方式编写的代码。使用if
-else
更自然:
if(power>1000)
{
price=76.00+.065*(power-1000);
}
else
{
price=76.00;
}