目录
前言: 什么是表达式呢?
表达式 可以是单个的常量,变量 ,函数调用 也可以是运算符将常量,变量连接起来的式子
如:int a=5; 5 c=sqrt(b);
c语言中的运算符是有优先级和结合方向的的,当优先级相同时,按照运算符结合方向进行运算,下面将介绍不同种类的运算符与其优先级和结合性。
先看这个表
在相同的优先级情况下 我们可以加()来进一步帮助我们理解结合的顺序
然而()可以改变运算的顺序,类比数学中的运算
我们也可以直接将右结合性的运算符记忆下来
分别有:一元运算符,强制类型转换操作符,赋值操作符,三目操作符
在看这个表 接下来我们将会按照这个表对操作符进行详细的解释
1 算术运算符
C语言中有六种基本(基本)的算数运算符分别是 + - * / %(取模) -(取负) 啊,先看前五个算术运算符均是双目运算符,那么什么是双目运算符呢?
先来介绍 目 ,目就是参与运算的数据,就是运算数,它可以是常量 也可以是变量哈。所以不难理解双目运算符就是有两个操作数
这里介绍一下算数运算符的优先级哈 最高的是-(取负) 。 -(取负)>(*,/,%)>(+,-) 这里可以类比数学中的运算顺序
注意/ 和% 的区别 /是取商 ,如果想得到小数的话,/的两边至少有一个是小数。如10/4=2 而10.0/4=2.5 ,这里需要注意。
而%是取余数,这个运算符的两侧必须都是整形,如10%3=1
规定m%(-n)=m%n
还有两个一元运算符,他们分别是++,--;
看下面的代码
++a 表示先做用,后自增,所以a=2,b=1;
++a 表示先自增,在作用,所以a=2,b=2;
同理a-- 与--a也一样
2 关系运算符
> ,<,==,>=,<=,!=
关系运算符的优先级低于算数运算符
这里在介绍一下关系表达式:
关系表达式的结果只有两个 真和假,非零为真,零为假 看下面的例子
这里的!是逻辑非,是一级运算符,后面会介绍
当while()语句括号里面的表达式为真的时候就会陷入死循环
3 逻辑运算符
! && || 这三个好兄弟分别叫做 逻辑非 ,逻辑与 ,逻辑或
优先级最高的是!,剩下的都低于关系运算符
下面介绍一下他们的用法:
! 具有右结合性 它可以将非0的数变成1 ,1变成0(也就是真变假,假变真)。 这玩意经常和关系表达式一起用,因为关系表达式的结果只有0或1。
&&具有左结合性 当左右两边的操作数同为1的时候才为1 ,(只有左边为1才能算右边)如果左边的运算结果为0那么右边的就不用算了 因位都为1才是1例如
int i=3,j=5,k;
k=(i++<0)&&(i
||同样具有左结合性 与&&不同的是当左右两边的操作数有一个是1的时候结果就为1(例如左边为1直接结束计算,只有左边为0才能计算右边),但是必须两边的值同时为0才是0
int i=3,j=5,k;
k=(i++<0)||(i
4 条件运算符
? :
看下面的例题:
这大哥最厉害了 是唯一一个三目 操作符 (回想一下啥是目)
下面介绍一下怎么使用它,先看一个例子 你是大牛吗?走向人生巅峰:好好学习成为大牛
这里“你是大牛吗”为表达式一 ,当真的时为候执行表达式二“走向人生巅峰”,当为假的时候执行表达式三“好好学习成为大牛”
5 赋值运算符
= 具有右结合性 。要注意的是左侧只能为变量
6 逗号运算符
, 在c语言中一般做分隔符 就是将参数分开
下面是摘抄的
c语言中,分隔符有逗号、空白符、分号和冒号。 (1)逗号作为分隔符用来分隔多个变量和函数参数; (2)空白符常用来作为多个单词间的分隔符,也可以作为输数据时自然输入项的缺省分隔符; (3)分号常用于for循环语中for后面,圆括号内的三个表达式之间;
这里说一下 空白符 如 int a; inta; 前一个是两个单词 而后一个是一个单词意义不一样
逗号表达式 :用逗号将表达式隔开的 并且将最后一个表达式的值最为最终的值
7 位运算符(位运算符的操作对象均为二进制位)
~, >>, << ,&, | ,^,分别为 按位取反, 右移位, 左移位, 按位与, 按位或, 按位异或
这里~的结合性为右结合性
下面一一介绍他们的用法
~ 按位取反 按位取反的对象是补码,并且符号位也要取反。但是在负数的原码变反码的过程中符号位不需要按位取反
看下面的例子:
内存中存储的整数的时候存储的是二进制位补码
计算的时候也是用二进制补码算
但是打印的时候是用原码算
>> 右移位 分为算术右移和逻辑右移 (移几位就相当于除了几个二)
算术右移:舍弃移出的位数 左边补符号位
逻辑右移:舍弃移出的位数,左边补零
<< 只有逻辑左移
& 按位与 有一个是零结果就是零,全为一才是一。 看下面的例子:
00010101
00000011
00000001
按位与有两个用途 :1 将某个或多个二进制位变成0 只要将对应的二进制位按位与上0
2 保留某个或多个的二进制位 只要将对应的二进制位按位与上1
| 按位或 有一个是一结果就是一,全为零才是零。看下面的例子:
00010110
01010101
01010111
按位或的一个用途: 可以将特定的位置固定为1
^ 按位异或 相同为零,相异为一 。看下面的例子
01010101
00101011
01111110
按位异或的两个用途:1 与0异或保留原值
2与1异或可使1变成0,0变成1
8 长度运算符
sizeof ,一元运算符
它是c语言中的关键字 作用是计算变量或者数据类型在内存单元中所占的长度(也就是字节数)
看下面的例子:
变量a的类型是整形,所以占4个字节,数组arr[10]里面有10个元素,每个元素的类型是整形所以占40个字节,而数据类型Int占用4个字节
这里有一个易混点就是运算符sizeof()与函数strlen()
看名字就知道他俩不一样 一个是求变量和数据类型所占的字节数的运算符,一个是计算字符串长度的函数
先不充一波字符串的知识 顾名思义字符串就是有一堆字符组合起来的 但是字符串他得有个结束标志吧?
于是就规定了\0为字符串的结束标志,在计算字符串的长度时,不算做内容,但是要占内存
下面来介绍他们两个的区别
先看这个图
图中显示 sz=7 ,str=6
这是为什么呢?
首先看数组a的类型是字符类型 ,我们知道字符类型的数据所占的字节为1,而hellow只有六个字符,为什么会打印出7呢?这就和上面那个补充的知识连接起来了 \0也会占用内存所以会打印出7
这里介绍一下strlen()函数 :它的作用是计算字符串中\0前面字符的个数,它遇到\0会停止并将\0前面字符的个数返回去 所以会打印6
9 强制类型转换
强制类型转换定义: 就是将变量从一种类型转换成另外一种类型 。 功能:把表达式的结果强制转化为类型说明符所表示的类型。
(类型说明符)表达式 看下面的例子:
这里将字符变量a的地址放在double类型的指针变量pa里,会出现 char*类型与double*不兼容的报错,但是将变量a强制转化为double类型就不会报错
10 下标引用操作符,函数调用操作符
[] 访问数组中的某个元素 如 int arr[5]={1,2,3,4,5}; arr[4] 表示数组中第5个元素。
() 调用函数 看下面的例子