1> i++与++i
i++和++i是C语言运算符,i++是后缀递增的意思,++i是前缀递增的意思。
-
i++
是后缀递增的意思,i++是先进行表达式运算,再进行自增运算。把i++的运算过程拆分开,等效于i=i+1可以看到运算结果是一致的。x = i ++; //先让x变成i的值1,再让i加1
-
++i
是前缀递增的意思,++i是先进行自增或者自减运算,再进行表达式运算。运算结果可以发现,仅从i的值来看,++i和i++最终的i值是一样的,都是i自增加了1。x = ++i; //先让i加1, 再让x变成i的值1
2> 对于位域的理解(int a:4);
以下程序在linux系统中已编译完成
1 /*---------------------------------------------------------------------
2 * Function: bit area
3 * Author: CDamogu
4 * Date: 2022/7/12
5 * Description: How to unstandard bit area,for example: int a:4;
6 * Opeartion System: Linux
7 ----------------------------------------------------------------------*/
8 #include <stdio.h>
9
10
11 struct bs
12 {
13 unsigned int a:4;
14 unsigned int b:4;
15 unsigned int c:2;
16 unsigned int d:6;
17 }structa;
18
19
20 void main()
21 {
22 structa.a=15;
23 structa.b=8;
24 structa.c=2;
25 structa.d=23;
26
27 printf("a is %d\n",structa.a);
28 printf("b is %d\n",structa.b);
29 printf("c is %d\n",structa.c);
30 printf("d is %d\n",structa.d);
31 printf("structa is %X(H)\n",structa);
32 printf("5E8F To Bin is: 0101 1110 1000 1111\n");
33 printf("5E8F To Bin is: 010111 10 1000 1111\n");
34 printf("5E8F To Bin is: 23 2 8 15 \n");
35
36 }
其执行结果如下:
[root@VM-0-5-centos tes1]# ./a.out
a is 15
b is 8
c is 2
d is 23
structa is 5E8F(H)
5E8F To Bin is: 0101 1110 1000 1111
5E8F To Bin is: 010111 10 1000 1111
5E8F To Bin is: 23 2 8 15
[root@VM-0-5-centos tes1]#
-
5E8F该值是我执行过以后,然后后面程序加了三行解析,为了方便理解定义的顺序和执行后在空间中存储的高低位
-
位域函数原型
struct name { type var_name : n; };
- 在结构体name汇总,成员变量var_name占用空间为n位。
- n为正整数,其值必须小于type类型占用的位数。
- 如type如果是int,占4字节32位,那么n必须是1~31之间的整数。
- 对于位域类型的成员,在赋值时如果实际值超过n位所能表达的范围,那么超出部分将会被截掉,只保存低位值。
- 如
int var:4
,本身只有4位的空间,如果赋值var = 20
, 由于20的二进制值为10100,实际为五位,这时var实际被赋值的就是低四位,0100,即4。
- 如
- 由于C语言中的地址是针对字节计算的,所以位域类型的成员变量不支持取地址操作
- 即对于变量a, 如果存在位域成员变量var,那么
&a.var
是非法的,编译会出错。
- 即对于变量a, 如果存在位域成员变量var,那么
-
一个位域必须存储在同一个字节中,不能跨两个字节。
- 如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 } //在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
-
位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k { int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 }; //从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。