在声明变量时初始化与在 c 中的单独行上进行初始化
Initializing while declaring a variable vs doing it on separate lines in c
请注意,我做这个奇怪的作业不是因为我不清楚语法或者是 c 的新手。
我只是在尝试如果将一个 int 分配给一个数组会发生什么:
int a = {1, 2, 3};
对此我收到以下警告:
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
当我打印 a 的内容时,我得到 1
。
但是当我这样做时:
int a;
a = {1, 2, 3};
我收到一个错误:
error: expected expression before ‘{’ token
a = {1, 2, 3};
^
虽然我知道数组并不意味着要分配给 int
变量,但上面的结果让我产生疑问:
int x; x = ...
和int x = ...
的区别
和
- 究竟是什么导致了警告或错误消息?
首先,
int a = {1, 2, 3};
是定义和初始化语句,而
int a;
a = {1, 2, 3};
是定义和赋值语句。
他们有不同的规则。语法 {1, 2, 3}
被称为大括号括起来的初始化列表,可以在初始化语句中使用,而不是在赋值中使用——这是一个语法错误。所以,这回答了第二个片段中的错误。
对于第一个片段,对于标量,引用 C11
,章节 §6.7.9/P11
The initializer for a scalar shall be a single expression, optionally enclosed in braces. [...]
因此,表达式 {1, 2, 3}
试图提供多于一个的元素,这是多余的。这就是您的编译器警告您的内容。
请注意,我做这个奇怪的作业不是因为我不清楚语法或者是 c 的新手。
我只是在尝试如果将一个 int 分配给一个数组会发生什么:
int a = {1, 2, 3};
对此我收到以下警告:
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
warning: excess elements in scalar initializer
int a = {1, 2, 3};
^
当我打印 a 的内容时,我得到 1
。
但是当我这样做时:
int a;
a = {1, 2, 3};
我收到一个错误:
error: expected expression before ‘{’ token
a = {1, 2, 3};
^
虽然我知道数组并不意味着要分配给 int
变量,但上面的结果让我产生疑问:
int x; x = ...
和int x = ...
的区别
和
- 究竟是什么导致了警告或错误消息?
首先,
int a = {1, 2, 3};
是定义和初始化语句,而
int a;
a = {1, 2, 3};
是定义和赋值语句。
他们有不同的规则。语法 {1, 2, 3}
被称为大括号括起来的初始化列表,可以在初始化语句中使用,而不是在赋值中使用——这是一个语法错误。所以,这回答了第二个片段中的错误。
对于第一个片段,对于标量,引用 C11
,章节 §6.7.9/P11
The initializer for a scalar shall be a single expression, optionally enclosed in braces. [...]
因此,表达式 {1, 2, 3}
试图提供多于一个的元素,这是多余的。这就是您的编译器警告您的内容。