#include <stdio.h>
int main()
{
typedef struct s
{
int a;
int b[5];
char c[2];
}st;
st vs[1];
vs[0] = {1,{1,2,3,4,5},{'c','d'}};
printf("%d:a\n",vs[1].a);
printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]);
printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]);
return 0;
}
为什么这不起作用?
on
gcc -o main *.c
我收到此错误
main.c:在函数'main'中: main.c:15:12:错误:'{'标记之前的预期表达式 vs [0] = {1,{1,2,3,4,5},{'c','d'}};
但如果我有这个:
#include <stdio.h>
int main()
{
typedef struct s
{
int a;
int b[5];
char c[2];
}st;
st vs[] = {
{1,{1,2,3,4,5},{'c','d'}}
};
printf("%d:a\n",vs[0].a);
printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]);
printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]);
return 0;
}
它有效。这是什么逻辑。
如何使用st vs [1]方法使其工作?
答案 0 :(得分:8)
声明变量时,只能执行 braced initialization 。所以,
vs[0] = {1,{1,2,3,4,5},{'c','d'}};
是允许的。但是
C99
不是。因为这不是初始化而是分配。
但是,您可以使用vs[0] = (struct s){1,{1,2,3,4,5},{'c','d'}};
的复合文字,请参阅EnumSet
:
<a class="donate" target="_self" rel="" href="/donate/donate-monthly">
答案 1 :(得分:3)
初始化是指声明变量并为其提供初始值作为声明的一部分。例如,这是合法的:
st vs[1] = { {1,{1,2,3,4,5},{'c','d'}} };
您的代码实际上正在尝试分配。赋值是指现有变量具有分配给它的值。您的代码无法正常工作的原因是{1,{1,2,3,4,5},{'c','d'}}
不是一个值。
在语句(不是声明)中,每个表达式必须由编译器根据其自身的优点可读,并且更复杂的语句由运算符连接的各种表达式组成。所以编译器不知道如何处理{1,{1,2,3,4,5},{'c','d'}}
- 在这个阶段它不知道那应该是st
。
从C99开始,你可以在这里使用一种新的语言结构,称为复合文字:
vs[0] = (const st){1,{1,2,3,4,5},{'c','d'}};
请注意,这不是应用于某种支撑表达式的强制转换运算符;它是一个单一的句法结构(Typename){ initializers }
。
我对const
的使用是微优化,它可以帮助编译器将文字存储在可执行文件的只读块中并允许常量折叠。