【问题标题】:Structure variable initialization/definition in one go after variable declaration is done变量声明完成后一次性初始化/定义结构变量
【发布时间】:2016-08-30 19:26:53
【问题描述】:

我们可以在声明或定义后一次性定义结构变量吗?全部放在一个大括号中,如

asd = {21,'H'};

如果无法完成的任何特殊原因,因为它可以在声明它的同一行中定义,例如:struct asd = {21,'H'}; ?

struct test
{
    int a;
    char b;
}asd;  

asd = {21,'H'};   // error: expected an expression

要求进行 C 编程。

【问题讨论】:

  • 因为聚合初始化不同于赋值。
  • 仅供参考:auto asd = {21,'H'}; 不起作用。 auto asd = {21,22}; 会编译,但不会执行您要求的操作。
  • 请您选择一种语言。 c 不是 c++ 不是 c。
  • 为什么重新标记为 C,这会使这里的答案无效
  • 再次添加了 c++,很困惑,我以为上面的人打算选择一个并删除另一个。相反,他问我想要哪种语言的答案或提出问题。

标签: c structure definition redefinition


【解决方案1】:
struct test
{
    int a;
    char b;
}asd; 

structtesttest类型的变量asd的定义。在;,您现在有一个名为asd 的默认构造对象。当你尝试做时

asd = {21, 'H'};

您正在尝试分配给 asd 和大括号列表,这将不起作用,因为它没有采用初始化列表的赋值运算符。

您可以在声明时初始化asd

struct test
{
    int a;
    char b;
}asd = {21, 'H'}; 

或者像这样做作业

asd = (struct test){21, 'H'};

如果您选择使用赋值,请注意它必须在函数内部完成,而不是在全局空间中。

【讨论】:

  • 分配需要在 main 中,否则会出现此错误:error: 'asd' does not name a type
  • @ArnavBorborah 补充了这一点。
  • @Lpdnn 我使用的是 C++ 语法。我用 C 语法更新了答案。
【解决方案2】:

需要显式类型转换:

struct test
{
    int a;
    char b;
} asd;  

asd = (struct test){21,'H'};

这段代码大致相当于下面的代码:

const struct test initialiser = {21,'H'};
... 
asd = initialiser;

不同之处在于,当这种优化比 const 结构复制初始化更有效时,编译器可以选择使用带有立即值的汇编指令优化对 asd 变量的赋值。

作为“副作用”,此语法在 CC++ 中均有效

【讨论】:

  • @2501 我不知道它有一个特定的名称。请告诉我好吗?
  • @nathanoliver 1. struct asd[5] 可以做同样的事情吗?在它的声明之后?不像 *(asd + 3) = (struct tt){ -2, '\0' };但是对于数组的所有元素,它们都在一行中。 2.可以所有普通数组如int ary[5] = {1,22,31,231,5};声明后可以做吗?例如:ary = (int){1,22,31,231,5};
  • @Lpdnn 不幸的是,不能以这种方式分配数组。唯一的解决方法是使数组成为结构的成员;
  • 结构数组分配在一起怎么样?结构 asd[5];你能给我一个例子来说明你的意思是让一个数组成为一个结构的成员来解决问题吗?
  • @lpdnn 无论数组项类型如何,除了数组声明中使用的初始化程序之外,不能为数组分配值。您必须使用 memcpy 或其他方式,即在循环或其他任何方式中为数组 [index] 分配一个值
【解决方案3】:

正如@CaptainOblivious 提到的:

——聚合初始化不同于赋值。

这意味着,您以后不能在为聚合对象赋值时使用聚合初始化,而不是显式或单独的,如下所示:

struct test
{
    int a;
    char b;
}asd; 
int main() {asd.a = 21; asd.b = 'H'}

另一种做法是稍后显式(这需要在 main 或另一个代码块中完成,否则会出现错误 (asd does not name a type)):

asd = test{21,'H'}

你可以做的另一件事是:

struct test
{
    int a;
    char b;
}asd = {21,'H'};

以上两种方法都可以,如下所示: Live Example

【讨论】:

    【解决方案4】:

    如果您要定义该类型的变量,则必须包含struct 部分,例如struct asd。但是这个定义和初始化一起工作得很好。

    struct test
    {
        int a;
        char b;
    } asd = { 21, 'H'};
    

    【讨论】:

    • OP 询问是否可以一次性完成定义和初始化,我的回答表明可以。感谢可爱的反对票。如果您知道得更多,请分享您的知识,这样我们都可以受益。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多