C 基本语法解读: 总结程序中的一些常用到的但是容易混乱的函数(i++与++i) (位域)


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]# 
  1. 5E8F该值是我执行过以后,然后后面程序加了三行解析,为了方便理解定义的顺序和执行后在空间中存储的高低位

  2. 位域函数原型

    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是非法的,编译会出错。
  3. 一个位域必须存储在同一个字节中,不能跨两个字节。

    • 如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
    struct bs 
    { 
    unsigned a:4 
    unsigned :0 /*空域*/ 
    unsigned b:4 /*从下一单元开始存放*/ 
    unsigned c:4 
    }
    
    //在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
    
  4. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

    struct k 
    { 
    int a:1 
    int :2 /*该2位不能使用*/ 
    int b:3 
    int c:2 
    };
    
    //从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDamogu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值