学习顺序:sizeof运算 → 逗号表达式 → 函数调用运算符 → 结构体struct(定义、初始化、访问成员)
一、sizeof 运算符
核心规则
- sizeof 是运算符,不是函数
- sizeof(表达式) :只看表达式最终类型,不会运行表达式里面的代码(编译期就算出大小,运行阶段不计算,在链接的时候就完成了,到不了编译那一步)
- 普通short是2字节;int是4字节。
表达式 short s =10; sizeof(s +9) :
- s是short,和int数字9相加,发生整型提升,结果类型变成int
- sizeof(s+9) = sizeof(int) = 4 //它只算类型
- 变量`s本身的值不会被修改**,s依旧=10
(因为还没有到编译那一步,它们就已经变成int了)
示例代码
#include <stdio.h>
int main()
{
short s = 10;
int n = 8;
// s+9 运算时short提升为int(会往大的变),所以sizeof结果是4
printf(“%zd\n”, sizeof(s + 9));
printf(“s = %d\n”, s); // s的值仍然是10,sizeof没有执行s+9计算
return 0;
}
输出:
4
s = 10
二、逗号表达式
规则
exp1, exp2, exp3, … ,expN
- 从左往右依次执行每一个表达式(它有一些表达式是没用的,不会影响下一步结果)
- 整个逗号表达式最终结果 = 最后一个表达式的值
- 优先级极低,低于赋值运算符,想用逗号表达式必须加 ()
例题
int a = 1;
int b = 2;
// 括号内是完整逗号表达式
int c = (a>b, a=b+10, a, b=a+1);
分步执行:
- a>b :1>2 → 假,不改变变量
- a = b+10 → a = 2+10 = 12
- a → 取a的值12(无赋值)
- b = a+1 → b =12+1=13
整个表达式结果是最后一项 b=a+1 的值 =13
所以c = 13
注意:如果去掉外层括号 int c = a>b, a=b+10, a, b=a+1;
就不是整体逗号表达式!等价于 (int c = a>b), a=b+10, a, b=a+1; ,c只会拿到a>b的结果0。
*** 一定要把逗号表达式全部括起来
其他逗号表达式例子
// if判断里,逗号表达式依次执行,最终判断d>0
if (a = b + 1, c = a / 2, d > 0)
{
}
等价于if的条件是d>0
三、函数调用运算符 ()
- () 叫函数调用运算符//函数调用是的符号
- 操作数:函数名 + 0个或多个参数
- 最少操作数:2个:函数名 + 空参数(无参函数调用)
例: printf(“hehe\n”);
操作数: printf (函数名)、 “hehe\n” (参数)
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf(“hehe\n”); // () 函数调用运算符
Add(3, 5);
return 0;
}
四、结构体 struct
结构体:把多个不同类型的变量打包成一个自定义类型,用来描述一个事物(学生、设备信息)
- 结构体声明语法
struct 标签名
{
成员列表; // 多个成员变量,可以不同类型
} 全局变量列表; // 可以直接定义全局变量,也可以省略
示例:学生结构体
// 定义结构体类型 struct Stu
struct Stu
{
char name[20]; // 姓名
int age; // 年龄
double score; // 分数
};
注意:char类型,[ ]里面的数字是字符长度的限度值,一个汉字2个byte,1个char占1个byte,一共可以放10个字,最多放19个数字和符号
- 结构体变量初始化
两种写法:顺序初始化、指定成员初始化(推荐,可读性强)
#include <stdio.h>
struct Stu
{
char name[20];
int age;
double score;
};
int main()
{
// 方式1:按成员定义顺序依次赋值
struct Stu s1 = {“zhangsan”, 20, 60.0};
// 方式2:指定成员初始化,顺序可以打乱,推荐工程代码使用
struct Stu s2 = {.name = "lisi", .age = 25, .score = 85.5};
return 0;
}
- 结构体成员访问运算符 .
结构体变量.成员名
printf(“%s %d %lf\n”, s1.name, s1.age, s1.score);
- 结构体嵌套(结构体里面包含另一个结构体)
// 嵌套的子结构体
struct Id
{
char id[20];
int x;
};
struct Stu
{
char name[20];
int age;
struct Id id; // 成员是另外一个结构体
double score;
};
int main()
{
// 嵌套结构体初始化
struct Stu s1 = {“zhangsan”, 20, {“2025010102”, 6}, 60.0};
// 访问嵌套结构体成员:变量.子结构体.成员
printf(“%s %d %s %d %lf\n”, s1.name, s1.age, s1.id.id, s1.id.x, s1.score);
return 0;
}
五、配套课后小练习题
- sizeof题
short a=5;
printf(“%zd”, sizeof(a+3)); //输出?
short 变成int,是由(a+3)导致的,相当于一瓶空气被导入了一房间的空气里面。
答案:4
- 逗号表达式
c
int x=2,y=3;
int res = (x++, y=x+2, x+y);
// res等于?
答案:8
- 结构体填空
c
struct Book{
char bookname[30];
float price;
};
struct Book b = {.bookname=“C语言”, .price=49.9};
printf(“书名:%s,价格:%.1f”, b.bookname, b.price);
补充:学习关联(嵌入式)
- struct 在嵌入式里超级常用:描述外设参数、设备信息、引脚配置。
- . 访问结构体成员,后面学指针的时候还会学 -> 箭头访问。
- 逗号表达式、位运算、sizeof,写驱动、宏定义经常见到。
1098



被折叠的 条评论
为什么被折叠?



