我搜索了 c 中枚举的静态用法,然后我在这里发布这个主题。我是一名测试人员,我需要通过编写一个简单的程序来测试本地、静态、全局范围的枚举数据类型。
一个简单的静态变量可以很容易地测试,同样我需要测试静态枚举数据类型。
我写了一个简单的代码。需要你们的帮助。
#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;
}
Run Code Online (Sandbox Code Playgroud)
让我知道代码是否测试枚举数据类型的静态功能。谢谢
注意:我搜索的主题让我选择了 C# 或 Java。
静态存储类与对象的链接和存储有关。它实际上与对象的类型没有任何关系。
下面是(我认为)你的程序正在做什么的解释:
enum day {sun=1,mon,tue,wed,thur,fri,sat};
Run Code Online (Sandbox Code Playgroud)
这使用标记 name 声明了一个枚举类型day
,并且还定义了许多枚举常量及其值。
static enum direction {UP,DOWN,RIGHT,LEFT};
Run Code Online (Sandbox Code Playgroud)
这使用标记 name 声明了一个枚举类型direction
,并且还定义了许多枚举常量及其值。
存储static
类在这里没有意义,因为您没有为对象定义(分配存储)。
int static_enum()
{
static enum direction dir = UP;
printf("dir = %d\n",dir);
dir++;
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这将输出枚举常量的值。
enum day fri = 25;
Run Code Online (Sandbox Code Playgroud)
fri
这定义了一个名为type 的块范围对象enum day
,并使用 value 进行初始化25
。同样命名的枚举常量fri
在此块中将不再可见(除非您重新声明enum day
)。
// now friday gets modified from 21 to 25 becasue we have re-assigned the value
printf("\nfri = %d\n",fri);
Run Code Online (Sandbox Code Playgroud)
这将输出对象 的值fri
,而不是枚举常量 的值fri
。没有任何修改。
// now saturday will still have value 22
printf("\nsat = %d\n",sat);
Run Code Online (Sandbox Code Playgroud)
sat
这将按预期输出枚举常量的值。
printf("\n");
static_enum();
static_enum();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
人们可能想知道为什么该语言允许在不定义对象(为其分配存储)的声明中使用static
存储类。我认为这只是语法上的便利,因为声明和定义共享相同的语法。C 语法允许您在声明中以任意顺序堆积任意数量的存储类、类型说明符、类型限定符、函数说明符和对齐说明符。然而,根据 C 标准的各个语义部分,许多组合是不允许的或导致未定义的行为。我认为没有什么可以禁止static
在 的声明中使用无意义的关键字direction
。