为什么案例标签在这个特定程序中没有减少到整数常量?

时间:2017-09-19 18:54:19

标签: c switch-statement

int main() {
    int marks;
    printf("enter the marks :");
    scanf(" %d", &marks);

    switch (marks) {
      case (marks >= 90):
        printf("Excellent");
        break;
      case (marks < 90 && marks >= 75):
        printf("very good");
        break;
      case (marks < 40):
        printf("poor");
        break;
      default:
        printf("no marks available");
    }
    return 0;
}

我最近开始学习C并且在运行switch语句时遇到了这个案例标签错误。

请有人解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

案件必须是不变的。 case (marks>=90):不使用常量。

  

每个case标签的表达式应为整数常量表达式,case switch语句中的same个常量表达式中没有两个在转换后具有相同的值“§6.8 .4.2 3

示例:

switch (grade) {
  case 'A': printf("Excellent"); break;
  case 'B': printf("very good"); break;
  case 'C': // fall though (no break)
  case 'D': printf("poor"); break;
  default: printf("Hmmm");
}

使用if(), else if(), else

可以更好地提供OP的代码
// switch(marks){
// case (marks>=90):
if (marks>=90) {
    printf("Excellent");
} else if (marks>=75) {
    printf("very good");
} else if (marks < 40){  // Perhaps OP wants (marks > 40) here
    printf("poor");
} else {
    printf("no marks available");
}

答案 1 :(得分:1)

To&#34; fix&#34;这个,你必须写

switch( marks )  // branch to the label corresponding to the value stored in marks
{
  case 100:
  case  99:
  // repeat with cases 98 through 91.  
  case  90: 
    printf( "Excellent!\n" );
    break;

  case 89:
  case 88:
  // repeat with cases 87 through 76
  case 75:
    printf( "very good\n" );
    break;

  // pattern should be obvious from here
}

case标签必须是整型常量表达式,基本上可以在编译时进行评估。像marks >= 90这样的关系表达式不算作常量表达式。

switch分支到与marks对应的标签; IOW,如果您想在marks的值从90100之间执行某个操作,那么您为每个值添加一个单独的标签。

您通常不会使用switch语句,其中包含值范围,如下所示;使用if-else语句可以做得更好。

修改

供参考,以下内容可用作case标签:

  • 整数文字(十进制,十六进制或八进制格式);
  • 字符常量(例如'A''?''\n'等);
  • 枚举常量;
  • 由任何前面的表达式组成的算术表达式;
  • 扩展为以前任何表达式的宏;

就C而言,const - 限定变量不是常量表达式,因此您不能执行以下操作:

const int foo = 10;
...
switch( bar )
{
  case foo: ... // compiler will yell at you here

您无法在switch中的字符串上进行分支;但是,您可以为字符串计算整数哈希值,并根据该值进行分支:

#define FOO_HASH 0xb887389 // result of running hash function on "foo"
#define BAR_HASH 0xb8860ba // result of running hash function on "bar"

/**
 * djb2 is a popular hash function
 * see http://www.cse.yorku.ca/~oz/hash.html for others
 */
unsigned long hash( const char *text )
{
  const unsigned char *str = (const unsigned char *) text;
  unsigned long hash = 5381;
  int c;

  while (c = *str++)
      hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

  return hash;
}

char text[SIZE];
if ( !fgets( text, sizeof text, stdin ) )
  // bail on input error

// remove newline from text somehow

switch( hash( text ) )
{
  case FOO_HASH: 
    // do something
    break;

  case BAR_HASH: 
    // do something else
    break;
}

答案 2 :(得分:0)

你不能在案件中提出条件。来自https://www.tutorialspoint.com/cprogramming/switch_statement_in_c.htm

案例的常量表达式必须与交换机中的变量具有相同的数据类型,并且必须是常量或文字。