环境
devCpp 5.11
问题简述
近期在写 C 语言程序时发现了一个我以前没有留神的问题,代码如下:
#include <stdio.h>
// 定义一个 "人" 构造体
struct Person{char name[50]="\0"; // 姓名
unsigned short age=0; // 年龄
float salary=0; // 薪水
};
int main()
{
// 实例化两个构造体 张三 和 李四
Person arr[2]={{"张三",38,4800},{"李四",25,3700}};
return 0;
}
我感觉没有什么问题,然而编译器报错了,谬误如下:
大略翻译过去的意思是:不能从初始化列表转为 XXX 类型。
谬误起因
- C 语言在申明构造体类型时,如果在构造体申明的同时就将构造体中成员进行赋值的话那么在实例化构造体时就不可能应用初始化列表办法进行初始化。
- 相当于创立构造体的霎时曾经被初始化,而再次应用初始化列表就是二次初始化,显然违反编译器的初心————初始化操作只能存在一次。不信?看上面代码及其运行后果。
#include <stdio.h>
struct Person{char name[50]="张三";
unsigned short age=27;
float salary=3750.25;
};
int main()
{
Person zs;
printf("%s %d %.2f\n",zs.name,zs.age,zs.salary);
return 0;
}
创立即初始化。
- 如果仍想要创立构造体对象则能够应用第一种办法,即创立后再赋值。
#include <stdio.h>
struct Person{char name[50]="\0";
unsigned short age=0;
float salary=0;
};
int main()
{
Person zs; // 张三
sprintf(zs.name,"%s","张三 \0"); // 格式化写入
zs.age=27; // 年龄赋值
zs.salary=4800; // 薪水赋值
printf("%s %d %.2f\n",zs.name,zs.age,zs.salary);// 打印信息
return 0;
}
- 如果仍想要创立构造体对象则能够应用第二种办法,即申明时不进行赋值操作。
#include <stdio.h>
struct Person{ // 留神:这里改变了
char name[50];
unsigned short age;
float salary;
};
int main()
{Person zs={"张三",27,4800};
printf("%s %d %.2f\n",zs.name,zs.age,zs.salary);
}