C语言学习笔记1

逗号表达式

例:设a和b为整型变量,执行语句b=(a=2+3,a*4),a+5;后,a和b的值为?
答案: a = 5, b = 20

	note:
				1、逗号表达式形如:表达式1, 表达式2, ... , 表达式n。
				2、整个逗号表达式的值为最后一个表达式的值。
				3、逗号表达式可以和赋值表达式等结合。	
				4、逗号表达式的优先级最低。
				5、逗号表达式的运算顺序从左到右(没有其它运算时,例如:括号、赋值)。

解释:
1、2 + 3, 2 * 4, 2 + 5 为逗号表达式。

2、2 + 3, 2 * 4, 2 + 5这个表达式的值为最后一个表达式的值:2 + 5 = 7。

3、a = 2 + 3, a * 4, a + 5,逗号表达式与赋值表达式的结合。

4、b = (a = 2 + 3, a * 4), a + 5
这句逗号表达式中结合了赋值运算和运算优先级,其中“括号” > “赋值” > “逗号”。

运算步骤为:

A、 先计算(a = 2 + 3, a * 4),括号里面是一个逗号表达式,赋值运算的
优先级高于逗号运算符,则先执行 a = 2 + 3,得出 a = 5;由于逗号表
达式的值是最后一个表达式的值,所以b = a * 4 = 20。

B、 这个逗号表达式b = (a = 2 + 3, a * 4), a + 5已经完成了b = (a = 2 + 3, a * 4)的
计算,接下来计算 a + 5,结果为10。所以整个逗号表达式最终的结果为10。
如果把上面表达式改成这样:c = (b = (a = 2 + 3, a * 4), a + 5),结果c = 10

使用sizeof对 结构体大小计算

例:
struct st
{
int a;
char b;
int c;
long d;
char e;
};
struct st stud;

使用sizeof计算上面结构体的大小。
已知:char占1个字节、int占4个字节、long占8个字节。

结构体大小的计算遵循两个原则:
1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之
间加上填充字节。
2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变
量大小的整数倍 如果不是会在最后一个成员后做字节填充。

			note:
				1、偏移量是指成员实际地址与结构体首地址的的差值。
				2、第一个成员的偏移量为0。
				3、0是所有值的整数倍。
				4、结构体大小:最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数。

现在计算结构体stud的大小:
1、第一个成员 int a :
偏移量: 0, 所占字节大小:4
解释: 偏移量0 是 是变量a所占字节大小 4 的整数倍。

2、第二个成员 char b:
偏移量:0 + 4 = 4,所占字节大小:1
解释: 偏移量 4 是 所占字节大小 1的整数倍

3、第三个成员 int c:
偏移量:4 + 1 = 5,所占字节大小:4
解释: 偏移量5不是所占字节大小的整数倍,所以编辑器自动补上3个空子节使其
当前偏移量:8 是所占字节大小:4的整数倍。

4、第四个成员 long d:
偏移量 :8 + 4 = 12, 所占字节大小: 8
解释:偏移量 12 不是所占字节大小8的整数倍,所以编辑器自动补上 6 个空子节使其
当前偏移量为:16 是所占字节大小 8 的整数倍。

5、第五个成员char e:
偏移量:16 + 8 = 24, 所占字节大小:1
解释: 偏移量24 是所占字节大小 1 的整数倍。

6、结构体大小:
最后一个成员的偏移量 + 最后一个成员所占字节的大小 = 24 + 1 = 25
25不是结构体成员中最宽字节 8 (long d)的整数倍,所以编辑器自动补上
7个空子节,最后结构体大小:25 + 末尾填充字节数 = 25 + 7 = 32。

小知识点

1、 关系运算符的运行结果为“真”或“假”。
关系运算符的优先级高于赋值运算符。

2、字符’\ddd’表示三位八进制,其中数字大小不能超过8。
字符’\xhh’表示两位十六进制数。

猜你喜欢

转载自blog.csdn.net/weixin_41682137/article/details/86473599