在C语言中的运算符有哪些类型?

发布时间: 17:09:28 来源:亿速云 阅读:84 作者:zzz 栏目:

这篇文章主要介绍“C语言中的运算类型有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中的运算类型有哪些”文章能帮助大家解决问题。

C语言中支持下面4种类型的运算

(+,-,*,/,%)

  • 就是数学中的加,减,乘,除等运算

  • 遵循先乘除后加减的运算优先级

  • 可以使用括号改变运算顺序

C语言中的除法运算,其除数不能为0

下面通过一段程序感受一下:

通过上面的代码,可以得到一些小结论:

  • 整型数的除法运算结果会舍弃小数部分

  • 取余(%)运算也是一种除法运算,结果为余数

  • 浮点数不能进行取余运算

  • 比较两个值大小关系或相等关系的运算

  • 比较的结果为逻辑值: 真(1),假(0)

  • 可以使用括号()改变关系运算的顺序

如上面的图片所示,c 的值就为0

下面通过一段代码,感受一下:

小技巧:如果不同类型的运算同时出现在一个表达式中,那么尽量使用括号()指明运算顺序。

运算优先级(优先级:四则运算 > 关系运算 > 赋值操作)

  • 大小比较运算 > 相等比较运算

下面看一段代码,深入感受一下运算优先级:

下面为输出结果,可以看出,c 的输出结果为1,为什么为1呢?这是由于乘法优先级大于加法优先级大于关系运算优先级,所以程序执行过程是这样,先计算 a * b,然后将 a * b 的结果 2 加上 b,得到4,最后再比较 a != 4,得到的结果当然为1啦,我们还可以通过反汇编来观察代码的执行过程。

所以如果想得到a != b 再加上a * b的结果,一定要记得加括号,如下:

这样才能得到正确结果,如下所示:

  • 整型数除法有两种:取商(/),取余(%)

  • 浮点数除法与数学中除法运算相同,结果为浮点数

  • 不同运算的优先级不同,可使用括号改变运算优先级

  • 同一个表达式中应避免不同的运算类型(四则运算,关系运算)

  • 逻辑运算的参与者为逻辑值(真或假)

  • 任何非零值在逻辑运算中都为真

  • 任何零值在逻辑运算中都为假

0 0 0
0 0
0 0
0 0 0
0
0
  • 从左向右进行,如果有一个操作数为假,则整个表达式为假

  • 第一个为假的操作数之后的其它操作数不再计算

  • 从左向右进行,如果有一个操作数为真,则整个表达式为真

  • 第一个为真的操作数之后的其它操作数不再计算

单目运算(只需要一个操作数),运算结果为逻辑值

  • 直接对数据的二进制位进行操作

  • 位运算的基本单位是二进制位,所以也是一种0和1的操作

  • 可以使用括号()改变位运算的运算顺序

  • 位运算的操作数只能是整型数(浮点数不能直接进行位运算)

左移:高位移出,低位补0
右移:低位移出,高位补符号位
按位异或:相同为0,不同为1

1.按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0

2.按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1

  • 将整数5的第2个二进制位置1

  • 将整数7的第4个二进制位取反

  • 将整数2的最后两位取反

  • 将整数15右移2位,再将第2个二进制位置0

  • 设变量a的二进制数是,若想通过运算a ^ b使得a的中间4位取反,其余位不变,则b的值是多少?

这里需要特别注意:对某一位或者某几位取反可以用异或(^)运算,这在工程里常用!!!

运算优先级(优先级从上到下为由高到低)

  • 正负号>逻辑非>按位取反

  • 乘除>加减>按位左右移

  • 大小比较运算>相等比较运算

  • 按位与>按位异或>按位或

  • 逻辑运算中有特殊的短路法则,结果确定后不再向下计算

  • C语言中的真值对应非零值,假值对应零值

  • 位运算直接对数据的二进制位进行操作

  • 位运算的操作数只能是整型数(浮点数不能直接进行位运算)

占用的内存大小不同,如:short占用2字节,int占用4字节

表示具体数据的方式不同

  • 正整数用原码表示,负整数用补码表示

  • 整数型和浮点型的二进制表示不同

位运算时需要明确的知道的事

  • 操作数的类型(占用的内存大小)

  • 操作数是正数还是负数(符号位,数据表示)

  • 不同类型的操作数先自动对齐再进行位运算(补符号位)

b为int类型,占4个字节,a为short类型,占2个字节。所以a要先要补符号位,由于a是正数,所以补0,这样就可以进行位运算了,得出c的结果为5。

  • 正数符号位为0,右移运算时,高位补0,低位移除

  • 负数符号位为1,右移运算时,高位补1,低位移除

  • 左移运算时,最高位移除,低位补0

  • 最高位的具体位置,由数据类型决定

  • 字符数据(单引号括起来的字符)的本质是整型数

  • char类型的变量可以打印为整数或者字符

需要注意的是,因为c为char类型,所以64左移1位后,用二进制表示为,最高位的1表示符号位,所以就是-128。

  • 不同类型的本质区别是:占用内存不同,数据表示不同

  • 右移运算时,高位补符号位,低位移除

  • char是只占用一个字节的整型,可表示英文字符

  • 数据符号位的具体位置由数据类型决定

关于“C语言中的运算类型有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

C语言有32个运算符,其中有些运算符比其他运算符要常用的多。我们前面已经讨论的那些是最常用的,现在我们将继续介绍几个比较有用的运算符。

关键字"sizeof" 经常被人误认为函数。

sizeof是C语言的32个关键字之一,并非“函数”(我们会后面介绍),也叫长度(求字节)运算符,sizeof是一种单目运算符,以字节为单位返回某操作数的大小,用来求某一类型变量的长度。其运算对象可以是任何数据类型变量

在32位操作系统下,运行结果如下:


1自动转换(5+5.000000=?结果是10还是10.000000):发生在不同类型的数据混合运算时,由编译系统自动完成。

不同的数据类型,要转换成精度较高的。

A转换按数据长度增加的方向进行,确保精度不降低,比如:int型和long型运算时,先把int量转成long型后再进行运算

 C在赋值运算中,赋值号两边的数据类型不同时,赋值号右边的类型将转换为左边的类型,如果右边的数据类型长度比左边长,将丢失一部分,丢失的部分按四舍五入向前舍入。

105为整型,5.000000 为双精度实型)

所以它的最终结果为精度最高的double型。

比如我们来看两个程序实例

为什么是一串很大的整数呢?而不是-14呢?问题就在自动转换上,我们观察上述讲过的转换规则,unsignedint同时出现运算时,int需要转换成unsigned,即:有符号需要转换成无符号类型。程序中的-20需要转换成无符号整型。

int型修改为char类型之后,结果竟然是-14,这又是为什么呢?还是自动转换规则。看规则,int以下类型(short,char不管有无unsigned)计算会转为int,也就是说不管有没有符号,char类型都要转换成int,所以a+b遵循了有符号整型的运算。

区别与自动转换,强制转换很明显是强制的。格式为:(类型说明符)表达式

强制转换为了实型。(int)(x+y)的意思是将x+y的值转换为整型。

3)需要注意的是:无论是自动转换或者是强制转换,都只是为本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型

1.运算符的优先级与结合性

圆括号下标运算符指向结构体成员运算符结构体成员运算符

逻辑非运算符按位取反运算符前缀增量运算符前缀减量运算符正号运算符负号运算符
类型转换运算符指针运算符地址运算符长度运算符

乘法运算符除法运算符取余运算符

等于运算符不等于运算符

2.算术运算(+-*/%

1乘除取余的优先级要高于加减;

2/”除运算,参加除运算的变量均为整数,结果也为整数(舍去小数),多数机器上采取“向零取整”的原则。比如:7/4=1(而不是1.75)-7/4=-1

3%,参与模运算的变量必须都为整型,其结果为两数相除的余数,并且余数与被除数的符号相同。比如:7%4=3,

(2)当赋值运算符两边的数据类型不同时,系统将自动进行类型转换,赋值运算符右边的数据类型转换成左边的变量类型,在上一篇中已经说过了。

3复合赋值运算:比如:n+=1等价于n=n+1;

如果n=3 ,n的值和m的值如下表所示


关于自增自减是一个重要的概念,在之后的指针学习中还会重点学习。

1表达式1,表达式2....表达式n。自左向右结合。

2表达式n的值为整个逗号表达式的值。比如:a=(1,2,3,4,5,6),a的值等于6。也就是最后一个的值。

3逗号运算符在所有运算符中的优先级别最低,它往往起到了把若干个表达式串联起来的作用。比如:a=3*4,a*5,a+10。 从左向右 先去3*4,然后将12的值赋给a,然后计算a*5。将60的值赋给a,然后计算a+10的值。

6.关系运算与逻辑运算

关系运算无非就是大于(>)小于(<),逻辑运算有非(!)与(&&)或(||

逻辑表达式的值只有真(1)和假(0)两个值

对于关系运算来说,a>b>c并不代表着a的值比b大,b的值比a大。关系运算与逻辑运算需要密切合作。我们来举一个例子:看两个程序。

我们看到的结果竟然是ERROR,而不是我们预想的OK,这是为什么呢?原因就在判断上。在数学上,a>b>c一点都没有错,但是在我们的C程序中,计算机判断条件的依据只有两种结果,那就是1(真)或者是0(假)。比如:a>b是真,所以a>b的值为1,然后1>c吗?很显然1=c,所以if()条件中的条件并不成立,所以结果为ERROR那这样怎么改呢?很简单,用逻辑运算符

7.1:位运算之取反(~)

1取反能对一个二进制的每一位都取反。

 看一个程序实例:

分析一下char类型默认分配一个字节,即8位。26的二进制为:

26的二进制取反(~a)得:,我们在中讲解过,无符号的二进制最高位为数据位,所以的十进制为229

2为了便于区分有符号和无符号的区别,我们再来做一个程序实例:

26的二进制:,取反:char类型默认有符号(我的是有符号,有些课本中说无符号),所以最高位为符号位,所以是负数,对减一取反是:,转换成二进制为-27

  对于这一块不理解的同学可以参考:

左移是将一个数的各个二进制位全部向左平移若干位,左边移出的部分忽略,右边空出的位置补0,比如:

 一个数据,每左移一位相当于乘以2,左移2位相当于乘以4。比如:4左移2=4*4=16

右移是将一个数的各个二进制位全部向右平移若干位,右边移出的部分忽略,左边空出的位置对于无符号数补0,对于有符号数,若原符号位为0,则全补0,若原符号位为1,则全补1比如:

A被定义为char (默认有符号)

7.5 位运算之异或(^

异或运算的作用是判断两个相应位的值是否相异。相异为1,反之则为0

我要回帖

更多关于 c语言中有几种运算符 的文章

 

随机推荐