Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构声明中的数组_C_Struct_Types_Declaration - Fatal编程技术网

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}
    };