在c中声明变量时初始化与在单独的行上执行
请注意,我之所以做这个奇怪的任务,并不是因为我不清楚语法,或者是c语言新手 我只是想尝试一下,如果一个int被分配了一个数组,会发生什么:在c中声明变量时初始化与在单独的行上执行,c,arrays,initialization,variable-assignment,C,Arrays,Initialization,Variable Assignment,请注意,我之所以做这个奇怪的任务,并不是因为我不清楚语法,或者是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
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
变量,但上面的结果让我产生了一个问题:
和intx之间的差异;x=…
int x=…
- 究竟是什么导致了警告或错误消息
- 首先
int a = {1, 2, 3};
是定义和初始化语句,以及
int a;
a = {1, 2, 3};
是一个定义和赋值语句
他们有不同的规则。语法{1,2,3}
称为大括号内的初始值设定项列表,可以在初始化语句中使用,而不是在赋值中使用-这是一个语法错误。这就回答了第二段中的错误
对于第一个片段,对于标量,引用第§6.7.9/P11章C11
标量的初始值设定项应为单个表达式,可以选择用大括号括起来。[……]
因此,表达式{1,2,3}
试图提供多个元素,这是多余的。这就是编译器警告您的地方。首先
int a = {1, 2, 3};
是定义和初始化语句,以及
int a;
a = {1, 2, 3};
是一个定义和赋值语句
他们有不同的规则。语法{1,2,3}
称为大括号内的初始值设定项列表,可以在初始化语句中使用,而不是在赋值中使用-这是一个语法错误。这就回答了第二段中的错误
对于第一个片段,对于标量,引用第§6.7.9/P11章C11
标量的初始值设定项应为单个表达式,可以选择用大括号括起来。[……]
因此,表达式
{1,2,3}
试图提供多个元素,这是多余的。这就是编译器警告您的内容。它们都是错误的,错误消息的内容和任何行为都取决于编译器编写者,因此错误消息或警告完全独立于我进行初始化的方式(直接对两行)?可能是编译器在初始化时分配其地址,或自动取消对第一个元素的引用,等等。但在分配的情况下,它实际上取决于编译器的设计方式。尝试在不同的编译器中运行您的代码以查看更改…Writeinta[3]={1,2,3}
@AlejandroBlasco,甚至更好,inta[]={1,2,3}代码>它们都是错误的,错误消息的内容和任何行为都取决于编译器编写者,因此错误消息或警告完全独立于我进行初始化的方式(直接对两行)?可能是编译器在初始化时分配其地址,或自动取消对第一个元素的引用,等等。但在分配的情况下,它实际上取决于编译器的设计方式。尝试在不同的编译器中运行您的代码以查看更改…Writeinta[3]={1,2,3}
@AlejandroBlasco,甚至更好,inta[]={1,2,3}代码>@Inian正如您应该知道的,实际的标准文档不是免费的。有在线免费提供的草稿版本。是的,我指的是你指的那个。我不会在这里添加链接,因为我不能保证这些(非官方)来源的可用性。快速的谷歌搜索应该会引导你找到草稿版本。当然,这是有道理的!谢谢@正如您应该知道的那样,实际的标准文档不是免费的。有在线免费提供的草稿版本。是的,我指的是你指的那个。我不会在这里添加链接,因为我不能保证这些(非官方)来源的可用性。快速的谷歌搜索应该会引导你找到草稿版本。当然,这是有道理的!谢谢