今天初识了结构体,并了解了一些运算符的优先级,下面将我今天所学内容分享给大家。
结构体成员访问操作符
1. 结构体定义与初始化
// 定义结构体类型student,并声明全局变量s2和s3
struct student
{
char name[20]; // 姓名,字符数组
int age; // 年龄,整型
int score; // 分数,整型
int id; // 学号,整型
}s2, s3; // 定义结构体全局变量s2和s3
int main()
{
int a = 10;
struct student s1; // 定义一个结构体局部变量s1
return 0;
}
2. 结构体初始化方式
struct student
{
char name[20];
int age;
float score; // 分数改为浮点型
int id;
};
int main()
{
int a = 10;
// 方式1:顺序初始化
struct student s1 = { "张三", 20, 90.5f, 1001 };
// 方式2:指定成员初始化(C99标准引入)
struct student s2 = {.age=20,.score=80.5f,.id=19029,.name="王麻子"};
return 0;
}
3. 嵌套结构体
// 定义地址结构体
struct address
{
char city[20]; // 城市
int phone_number; // 电话号码
};
// 定义学生结构体,嵌套address结构体
struct student
{
char name[20];
int age;
struct address add; // 嵌套结构体
float score;
int id;
};
int main()
{
// 初始化嵌套结构体
struct student s1 = { "张三",20,{"beijing",10086},99.3f,10098 };
// 修改结构体成员
s1.age = 21; // 直接修改整型成员
// 注意:数组修改需要使用strcpy函数
// strcpy(s1.name, "李四");
// 打印结构体成员
printf("%s\n", s1.name);
printf("%d\n", s1.age);
printf("%s\n", s1.add.city);
printf("%d\n", s1.add.phone_number);
printf("%f\n", s1.score);
printf("%d\n", s1.id);
return 0;
}
运算符优先级
1. 前置和后置递减运算符
int main()
{
int a = 10;
int b = 10;
// 前置递减:先减1再使用
int c = a + --a; // 先将a减1变为9,再计算9+9=18
printf("%d\n", c); // 输出18
// 后置递减:先使用再减1
int d = b + b--; // 先计算10+10=20,再将b减1变为9
printf("%d\n", d); // 输出20
}
2. 多个前置递增运算符
int main()
{
int i = 1;
// 注意:多个前置递增在同一个表达式中是未定义行为(UB)
// 不同编译器可能有不同实现
// 在GCC中通常会先完成所有前置递增,再进行加法运算
int ret = (++i) + (++i) + (++i); // 3个4相加=12
printf("%d\n", ret); // 输出12
printf("%d\n", i); // 输出4
}