1

在C语言中,如果它们属于同一类型,我们可以将一个结构变量的值分配给另一个。根据这一点,在我的以下程序中,s1=s2当两者都是struct相同类型的变量时,我可以使用它们。但是为什么我之后就不能使用s1={59,3.14}了吗?

我知道除了在初始化语句中之外,我们不能将字符串分配给"Test"字符数组,因为对于字符串,它在分配期间分解为类型,因此存在类型不匹配错误。但在我的程序中, 不会分解为任何指针,是吗?为什么即使它是相同的类型也不允许分配它,特别是因为它在初始化期间是允许的?和之间有什么区别,允许分配一个但另一个不是?arr"Test"char*{59,3.14}s1s2{59,3.14}s1

#include<stdio.h>

int main(void)
{
    struct test1
    {
        int a;
        float b;
    } s1= {25,3.5},s2= {38,9.25};

    printf("%d,%f\n",s1.a,s1.b);

    s1=s2;   // Successful
    printf("%d,%f\n",s1.a,s1.b);

    s1= {59,3.14}; //ERROR:expected expression before '{' token|
    printf("%d,%f\n",s1.a,s1.b);

}
4

2 回答 2

2

您需要以这种方式进行转换:s1 = (struct test1){59, 3.14};让编译器知道它应该考虑您的 {...} 类型的 struct test1。

换句话说,您在括号之间收集的数据没有类型,这就是为什么您需要使用强制转换来指定一个类型。

编辑:

编译器需要知道每个结构字段的预期类型。这需要知道每个参数、填充等的正确字节数。否则它也可以将值 59(这意味着是一个 int)复制为一个 char,因为它是一个适合一个字节的值。

于 2013-05-17T16:42:14.093 回答
2

C 文法严格区分赋值和初始化。

对于初始化,右边的类型应该是什么很清楚:声明的对象的类型。所以初始化符号是明确的;{ a, b, c }是声明顺序的字段。

对于分配,事情不太清楚。赋值表达式X = Y首先计算两个子表达式 (XY),查看它们的类型,然后进行必要的转换,如果可能的话,从类型Y到 类型X。表单的表达式{ a, b, c }没有类型,因此该机制不起作用。

yoones 在他的回答中使用的构造是另一种动物,称为复合文字。这是一种创建指定类型的未命名辅助对象的方法。您可以在初始化或您想要使用临时对象的任何其他地方使用它。复合文字的存储类和生存期是从使用它的上下文中推断出来的。如果它在函数范围内,它是自动的(在“堆栈”上),就像在同一个块中声明的普通变量一样,只是它没有名称。如果它在文件范围内使用(例如“全局”变量的初始化),则具有静态存储持续时间和生命周期,即程序执行的整个持续时间。

于 2013-05-17T20:13:28.510 回答