3

该程序产生以下错误:

case 标签不会减少为整数常量|

我只是不明白为什么在函数体内显式声明的常量third_cond,分配的初始化程序不被视为常量,而'd 标识符同时被视为常量。如果我使用文字,程序可以正常工作而不是或简单地作为. 请解释为什么会这样,除非这个问题是重复的。我查了,但没有找到答案。3case 3#definesecond_value3third_cond#define third_cond3

#include<stdio.h>
#define second_cond 2

int main()
{
   const int third_cond=3;
   int choice;
   printf("Enter your choice\n");
   scanf("%d",&choice);

   switch(choice)
   {
       case 1:
       printf("Beggar");
       break;
       case second_cond:
       printf("Mugger");
       break;
       case third_cond:
       printf("Lugger");
       break;
       default:
       printf("Bugger");
   }
}
4

2 回答 2

9

在 Cconst中并不意味着常量而是只读的。const限定变量永远不是常量,不能在需要常量表达式的地方使用。

请注意,您也可以将enum常量用于case常量表达式,因为enum常量是实常量。

于 2013-04-26T12:13:54.073 回答
1

常量实际上是一个值:"string constant", 1L, 0.5, 0xAF, ...

您可以定义自己的常量enum

enum
{
    MY_CONSTANT_1,
    MY_CONSTANT_2,
    /* ... */
}

switch-case等待可以转换为int(so, enum, int, long, ...)的常量。

A#define声明一个宏,因此在编译时second_cond被替换为2,它是一个常量。

third_cond仍然是一个变量,一个只读变量(因为const),因此,不能保证它的值保持不变(即使存在const仅将标识符标记为只读,而不是关联的内存) .

于 2013-04-26T12:25:44.160 回答