环境
devCpp 5.11
问题简述
近期在写C语言程序时发现了一个我以前没有注意的问题,代码如下:
#include
//定义一个 "人" 结构体
struct Person{
char name[50]=" "; //姓名
unsigned short age=0; //年龄
float salary=0; //薪水
};
int main()
{
//实例化两个结构体 张三 和 李四
Person arr[2]={{"张三",38,4800},{"李四",25,3700}};
return 0;
}
我感觉没有什么问题,但是编译器报错了,错误如下:
大概翻译过来的意思是:不能从初始化列表转为XXX类型。
错误原因
- C语言在声明结构体类型时,如果在结构体声明的同时就将结构体中成员进行赋值的话那么在实例化结构体时就不能够使用初始化列表方法进行初始化。
- 相当于创建结构体的瞬间已经被初始化,而再次使用初始化列表就是二次初始化,显然违背编译器的初心————初始化操作只能存在一次。不信?看下面代码及其运行结果。
#include
struct Person{
char name[50]="张三";
unsigned short age=27;
float salary=3750.25;
};
int main()
{
Person zs;
printf("%s %d %.2fn",zs.name,zs.age,zs.salary);
return 0;
}
创建即初始化。
- 如果仍想要创建结构体对象则可以使用第一种方法,即创建后再赋值。
#include
struct Person{
char name[50]=" ";
unsigned short age=0;
float salary=0;
};
int main()
{
Person zs; //张三
sprintf(zs.name,"%s","张三 "); //格式化写入
zs.age=27; //年龄赋值
zs.salary=4800; //薪水赋值
printf("%s %d %.2fn",zs.name,zs.age,zs.salary);//打印信息
return 0;
}
- 如果仍想要创建结构体对象则可以使用第二种方法,即声明时不进行赋值操作。
#include
struct Person{ //注意:这里改动了
char name[50];
unsigned short age;
float salary;
};
int main()
{
Person zs={"张三",27,4800};
printf("%s %d %.2fn",zs.name,zs.age,zs.salary);
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net