我在c中搜索了enums上的静态用法,然后我在这里发布了这个主题。我是测试人员,我需要通过编写一个简单的程序来测试本地,静态,全局范围的 enum数据类型。
可以轻松测试一个简单的静态变量,类似我需要测试静态枚举数据类型。
我写了一个简单的代码。需要你的帮助。
#include<stdio.h>
enum day {sun=1,mon,tue,wed,thur,fri,sat};
static enum direction {UP,DOWN,RIGHT,LEFT};
int static_enum()
{
static enum direction dir = UP;
printf("dir = %d\n",dir);
dir++;
}
int main()
{
printf("\nsun = %d mon = %d tue = %d wed = %d thurs = %d fri = %d sat = %d\n",sun,mon,tue,wed,thur,fri,sat);
enum day fri = 25;
// now friday gets modified from 21 to 25 becasue we have re-assigned the value
printf("\nfri = %d\n",fri);
// now saturday will still have value 22
printf("\nsat = %d\n",sat);
printf("\n");
static_enum();
static_enum();
return 0;
}
如果代码测试枚举数据类型的静态功能,请告诉我。 谢谢
注意:我搜索过的主题让我认识C#或java。
答案 0 :(得分:4)
static 存储类与对象的链接和存储相关。它与对象的类型没有任何关系。
下面解释了(我认为)你的程序在做什么:
enum day {sun=1,mon,tue,wed,thur,fri,sat};
这声明了一个带有标记名day
的枚举类型,并且还定义了许多枚举常量及其值。
static enum direction {UP,DOWN,RIGHT,LEFT};
这声明了一个带有标记名directions
的枚举类型,并且还定义了许多枚举常量及其值。
static
存储类在这里没有意义,因为您没有为对象定义(分配存储)。
int static_enum()
{
static enum direction dir = UP;
printf("dir = %d\n",dir);
dir++;
}
这定义了一个名为dir
的块范围对象,其类型为enum direction
。 static
存储类意味着将在程序启动时分配和初始化对象,并且它将在函数调用之间保留其最后存储的值。
int main()
{
printf("\nsun = %d mon = %d tue = %d wed = %d thurs = %d fri = %d sat = %d\n",sun,mon,tue,wed,thur,fri,sat);
这将输出枚举常量的值。
enum day fri = 25;
这定义了一个名为fri
的块范围对象,类型enum day
,用值25
初始化。在此块中,名为fri
的枚举常量将不再可见(除非您重新声明enum day
)。
// now friday gets modified from 21 to 25 becasue we have re-assigned the value
printf("\nfri = %d\n",fri);
这会输出对象 fri
的值,不 枚举常量 fri
的值。什么都没有被修改。
// now saturday will still have value 22
printf("\nsat = %d\n",sat);
这将按预期输出枚举常量sat
的值。
printf("\n");
static_enum();
static_enum();
return 0;
}
有人可能想知道为什么该语言允许{(1}} 存储类在未定义(分配存储)对象的声明中。我认为由于声明和定义共享相同语法的方式,这只是一种语法上的便利。 C语法允许您堆积任意数量的存储类,类型说明符,类型限定符,函数说明符< / em>和 alignment-specifier 以声明中的任何顺序排列。但是,根据C标准的各种语义部分,许多组合是不允许的或导致未定义的行为。我不认为在static
的声明中有任何禁止无意义static
关键字的内容。