gpt4 book ai didi

c - 对于结构变量s1,s2,为什么我可以初始化 "s1={25,3.5}",将s2赋值为 "s1=s2",然后就不能使用“s1={59,3.14}?

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:44 24 4
gpt4 key购买 nike

在 C 语言中,如果一个结构变量的类型相同,我们可以将其值赋给其他结构变量。据此,在我接下来的程序中,我可以使用 s1=s2当两者都是相同类型的 struct 变量时。但是为什么我不允许在那之后使用 s1={59,3.14} 呢?

我知道我们不能将字符串 "Test" 分配给字符数组 arr 除了在初始化语句中,因为对于字符串 "Test",它在分配期间分解为 char* 类型,因此存在类型不匹配错误。但在我的程序中,{59,3.14} 不分解到任何指针,是吗?为什么不允许将它分配给 s1,即使它是同一类型,特别是因为在初始化期间允许它? 之间有什么不同s2{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);

}

最佳答案

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

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

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

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

关于c - 对于结构变量s1,s2,为什么我可以初始化 "s1={25,3.5}",将s2赋值为 "s1=s2",然后就不能使用“s1={59,3.14}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com