C结构声明中的数组
你能解释一下这个代码是做什么的,以及C结构声明中的数组,c,struct,types,declaration,C,Struct,Types,Declaration,你能解释一下这个代码是做什么的,以及struct声明是如何工作的吗 enum tokens { ARG, CHAR, INT, IF, ELSE, FOR, DO, WHILE, SWITCH, RETURN, EOL, FINISHED, END }; [……] 就结构而言,struct是用户定义的数据类型。 它允许在一个名称下将多个基本数据类型分组在一起。 紧挨着关键字struct的单词是结构名。 考虑到您提供的示例代码,命令是结构名称。 结构中的变量永远不能初始化为
struct
声明是如何工作的吗
enum tokens
{
ARG, CHAR, INT, IF, ELSE, FOR, DO, WHILE,
SWITCH, RETURN, EOL, FINISHED, END
};
[……]
就结构而言,struct是用户定义的数据类型。 它允许在一个名称下将多个基本数据类型分组在一起。 紧挨着关键字struct的单词是结构名。 考虑到您提供的示例代码,命令是结构名称。 结构中的变量永远不能初始化为值。 声明结构变量的语法为 结构结构名称变量名称 可以使用结构变量和点(.)运算符访问结构中的变量 commands.tok='a'
我希望在单独的语句中定义
表
,如下所示:
struct commands
{
char command[20];
char tok;
};
struct commands table[] =
{
"if", IF,
"else", ELSE,
"for", FOR,
"do", DO,
"while", WHILE,
"char", CHAR,
"int", INT,
"return", RETURN,
"end", END,
"", END
};
效果是一样的table[]
是一组struct命令
元素,使用初始值设定项列表中的值进行初始化。enum
值的类型为int
,其中ARG
的值为0;每个后续的enum
成员的值都大于其前面的值。必须预料的是,enum
永远不会变得太大,以至于成员值不能存储在char
中,因此struct
中的char
成员用于保存此值。对于tok
,这似乎是一种通过使用char
成员而不是int
成员来节省内存的方法,但这只会在内存严重受限的环境中产生影响,或者在使用许多这样的命令的情况下才会产生影响
请注意,以这种方式初始化可能会在某些编译器上触发警告:
警告:初始值设定项周围缺少大括号[-w缺少大括号]
最好在单个struct
初始值设定项周围放置大括号:
struct commands
{
char command[20];
char tok;
}
table[] =
{
{"if", IF},
{"else", ELSE},
{"for", FOR},
{"do", DO},
{"while", WHILE},
{"char", CHAR},
{"int", INT},
{"return", RETURN},
{"end", END},
{"", END}
};
这将消除缺少大括号的警告,并使代码更加清晰。另一种选择是使用指定的初始值设定项语法,以便更加清晰:
struct commands
{
char command[20];
char tok;
}
table[] =
{
{.command = "if", .tok = IF},
{.command = "else", .tok = ELSE},
{.command = "for", .tok = FOR},
{.command = "do", .tok = DO},
{.command = "while", .tok = WHILE},
{.command = "char", .tok = CHAR},
{.command = "int", .tok = INT},
{.command = "return", .tok = RETURN},
{.command = "end", .tok = END},
{.command = "", .tok = END}
};
struct commands
{
char command[20];
char tok;
}
table[] =
{
{.command = "if", .tok = IF},
{.command = "else", .tok = ELSE},
{.command = "for", .tok = FOR},
{.command = "do", .tok = DO},
{.command = "while", .tok = WHILE},
{.command = "char", .tok = CHAR},
{.command = "int", .tok = INT},
{.command = "return", .tok = RETURN},
{.command = "end", .tok = END},
{.command = "", .tok = END}
};