在c中声明变量时初始化与在单独的行上执行

在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

请注意,我之所以做这个奇怪的任务,并不是因为我不清楚语法,或者是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
变量,但上面的结果让我产生了一个问题:

  • 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}
      试图提供多个元素,这是多余的。这就是编译器警告您的内容。

      它们都是错误的,错误消息的内容和任何行为都取决于编译器编写者,因此错误消息或警告完全独立于我进行初始化的方式(直接对两行)?可能是编译器在初始化时分配其地址,或自动取消对第一个元素的引用,等等。但在分配的情况下,它实际上取决于编译器的设计方式。尝试在不同的编译器中运行您的代码以查看更改…Write
      inta[3]={1,2,3}
      @AlejandroBlasco,甚至更好,
      inta[]={1,2,3}它们都是错误的,错误消息的内容和任何行为都取决于编译器编写者,因此错误消息或警告完全独立于我进行初始化的方式(直接对两行)?可能是编译器在初始化时分配其地址,或自动取消对第一个元素的引用,等等。但在分配的情况下,它实际上取决于编译器的设计方式。尝试在不同的编译器中运行您的代码以查看更改…Write
      inta[3]={1,2,3}
      @AlejandroBlasco,甚至更好,
      inta[]={1,2,3}@Inian正如您应该知道的,实际的标准文档不是免费的。有在线免费提供的草稿版本。是的,我指的是你指的那个。我不会在这里添加链接,因为我不能保证这些(非官方)来源的可用性。快速的谷歌搜索应该会引导你找到草稿版本。当然,这是有道理的!谢谢@正如您应该知道的那样,实际的标准文档不是免费的。有在线免费提供的草稿版本。是的,我指的是你指的那个。我不会在这里添加链接,因为我不能保证这些(非官方)来源的可用性。快速的谷歌搜索应该会引导你找到草稿版本。当然,这是有道理的!谢谢