【 C语言知识框架】第一章 C语言基本概念(下)

文章目录

一、寄语

二、前言

三、C语言基本概念(下)

(五)系统“自动类型转换”

(六)强制类型转换表达式

(七)算术表达式​​​​​​​

(八)赋值表达式​​​​​​​

(九)关系表达式​​​​​​​

(十)逻辑表达式​​​​​​​

(十一)自加、自减和逗号运算​​​​​​​

(十二)位运算​​​​​​​

(十三)字节对齐


一、寄语

    想想接触C语言已经快四年了,可知道去年工作时候,才发现自己的C语言知识框架很散。所以,在去年公司考核之后,就不断恶补C语言指针结构体等等知识,并梳理出了自己理解的C语言知识框架。发现梳理完之后,自己对C语言知识升了一个阶。也希望能通过该博文分享下自己梳理C语言的知识框架(还会附上一些我遇到过的坑),希望大家能从中发现自己C语言知识盲区。

    如果有哪里写的不够好,还请各位博友多多保函哈。另,还请大佬们多多指教!

二、前言

    这一篇博文来给大家分享梳理的C语言知识框架,和自己开发过程中遇到的一些坑。

三、C语言基本概念(上)

(五)系统“自动类型转换”

在C语言的语句表达式中应使用类型相同的变量和常量。但是,如果使用混合类型,C语言采用了一套规则进行自动类型转换。但是,最好还是使用强制转换。

转换规则:char&short -> int -> unsigned -> long -> double <- float

①当赋值运算符左边的变量为短整型变量,右边的值为长整型变量,短整型变量只能接受长整型变量低位上两个字节中的数据,高位上两个字节中的数据将丢失;

②当赋值运算符左边的变量为无符号整型,右边的值为有符号整型时,则把内存中的内容原样复制。右边数值的范围不应超出左边变量可以接受的数值范围,此时负数将转换为正数;

③当赋值运算符左边的变量为有符号整型,右边的值为无符号整型时,复制的机制同上。这时若符号位为1,将按负数处理

④C语言规定,所有实数的运算都是以双精度方式进行的,若是单精度数值,则需要在尾数后面补零,转换长双精度数才能进行运算。

(六)强制类型转换表达式

(1)强制类型转换运算符

利用强制类型转换运算符可以将一个表达式的值转换成所需类型。

  1. 赋值表达式

【格式】(类型名)(表达式)  ##“类型名”称为强制类型转换运算符。

 注意:

    ①对象:任意;

(七)算术表达式

1.基本的算术运算符

C语言中,基本的运算符包括5种:加(+)、减(-)、乘(*)、除(/)和求余(%)。特点

①+、-、*、/可以使用整型实型数据;

②%只能是整型,如3%2=1;

③加法运算结果:正、负、零、溢出;

④无符号整数相加,最大整数值:INT_MAX(定义在<limits.h>中)0,可用于判断是否溢出;

          用法1:if((unsigned)a + (unsigned)b > INT_MAX)  complain();

          用法2:if(a > INT_MAX-b)  complain();

2.算术表达式

算术表达式的运算规则和要求

①使用多层圆括号:运算时从内层圆括号开始,由内向外依次计算

②包含不同优先级的运算符,则按运算符的优先级由高到低进行

③若表达式中运算符的级别相同,则按运算符的结合方向进行;

④当运算对象是负数时,不同机器的运算结果也可能是不同的;

 

⑤双目运算符两边的数值类型必须一致才能进行运算,所得结果也是相同类型的数值。双目运算符两边的数值类型如果不一致,必须由系统先进行一致性转换

——如果一个为无符号一个为有符号,则有符号会转成无符号,不会溢出;两个都是有符号,结果就会发生溢出;

(八)赋值表达式

1.赋值表达式

(1)赋值运算符

赋值运算符的符号为“=”,由赋值运算符组成的表达式称为赋值表达式。先求出右边表达式的值,然后把此值赋给赋值号左边的变量。

【格式】变量名=表达式

  1. 赋值表达式

【格式】<变量><赋值运算符>(表达式)

注意:

①对象类型:任意(需要与变量类型一致);

②赋值运算符的优先级别只高于逗号运算符,且具有自右向左的结合性;

③赋值运算符的左侧只能是变量,不能是常量或表达式

  1. 赋值语句

【格式】<变量><赋值运算符>(表达式);

【说明】在赋值表达式的尾部加上一个“;”号,就构成了赋值语句,也称表达式语句。

2.复合赋值表达式              

在赋值运算符之前加上其它运算符可以构成复合赋值运算符。如:+=、-=、*=、/=、-=。复合赋值运算符的优先级与赋值运算符的优先级相同

例如:x *= y; --> x = x*y;

3.赋值运算中的类型转换[A1] 

赋值运算符两侧的数据类型不一致:左边变量的类型<--右侧表达式求得的数值类型;也可以用强制类型转换。

(九)关系表达式

1.关系运算符

关系运算符实际上是“比较运算”,即进行两个数的比较,判断比较的结果是否符合指定的条件。

C语言提供6种关系运算符:

小于(<);小于或等于(<=);大于(>);大于或等于(>=);等于(==);不等于(!=);

注意:

①由两个字符组成的运算符之间不允许有空格

②关系运算符是双目运算符,具有自左向右的结合性。

2.关系表达式

运算对象:C语言中任意合法的表达式;

逻辑值:整数0或者整数1;

(十)逻辑表达式

1.逻辑运算符

(1)C语言提供了3种逻辑运算符:

逻辑与“&&”;逻辑或“||”;逻辑非“!”;

另外,‘&’ 和‘|’为按位运算符;

(2)用关系运算符时应注意两点:

①由两个字符组成的运算符之间不允许有空格

②逻辑运算符具有从左到右的结合性;

③“&&”和“||”先对其左边进行求值,只有在必要时候才对右边进行求值;

2.逻辑表达式

运算对象:C语言中任意合法的表达式;

逻辑值:真(1)或者为假(0)。

(十一)自加、自减和逗号运算

1.自加运算符(++&--)

(1)规则

①运算符“++”是单目运算符,运算对象可以是整型变量,也可以是实整型变量,但不能是常量或表达式。所以像++3、(i+j)++是不合法的;

②用自加运算符构成表达式时,既可以是前缀形式(用前运算),也可以是后缀形式(用后运算)。

③运算符“++”的结合方向是“自右向左”。

        ④自减运算符(--),也一样;

(2)--n >=0 和 n-- >0 区别

    两种方式等效;但是第二种需要先保存n,再从中减去1;

2.逗号运算符和逗号表达式

(1)逗号运算符“,”

结合性:从左到右;逗号运算符优先级:最低

(2)逗号表达式

【格式】表达式 1,表达式 2,…,表达式 n

【说明】最后一个表达式的值就是此逗号表达式的值

(十二)位运算

1.“左移”运算

左移(<<)运算符是双目运算符。

运算符左边是移动对象,右边是整型表达式,代表左移的位数。

左移时,右端(低位)补0;左端(高位)移出的部分舍弃。

2.“右移”运算

右移(>>)运算符的使用方法与左移运算符相同,只是移位方向相反。

右移时,右端(低位)移出的二进制数舍弃,左端(高位)移入的二进制数分两种情况:对于无符号整数和正整数,高位补0;对于负整数,高位补1

3.“按位与”运算

按位与(&)运算符的作用是:把参加运算的两个运算数按对应的二进制位分别进行“与”运算,当两个相应的位都为1时,该位的结果为1;否则为0。

4.“按位或”运算

    按位或(|)的运算规则是:参加运算的两个运算数中,只要两个相应的二进制位中一个为1,则该位的运算结果即为1;只有当两个相应位的数都为 0 时,该位的运算结果才为 0。

5.“按位异或”运算

按位异或(^)的运算规则是:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;若数不同,该位的结果为1。例如:111001 ^ 101010 = 010 011;

6.位数不同运算规则

规则:

①先将两个运算数右端对齐;

②再将位数短的一个运算数往高位扩充(无符号数和正整数左侧补0,负数最左侧补1),然后对位数相等的这两个运算数按位进行运算。

(十三)字节对齐

运行的环境是32位系统,系统向内存保存参数的时候就按32位去保存,也就是4字节保存,4字节对齐。

参数:char、short、int、double等标准数据类型;自己定义的结构体;数组和联合。

需要满足条件:

    ①自身对齐;(参数自己需要的类型)

    ②系统对齐规则;(系统本身对齐需求)

以下是32位系统下的字节对齐;(如果是16位系统,则为4+4+2=10)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值