c语言中表达式和操作符详解

目录

前言:   什么是表达式呢?

1  算术运算符 

2 关系运算符 

3 逻辑运算符 

4 条件运算符

5 赋值运算符 

6 逗号运算符 

7 位运算符(位运算符的操作对象均为二进制位)

8 长度运算符

9 强制类型转换

10 下标引用操作符,函数调用操作符



前言:   什么是表达式呢?

表达式 可以是单个的常量,变量 ,函数调用   也可以是运算符将常量,变量连接起来的式子

如:int a=5;    5    c=sqrt(b);

c语言中的运算符是有优先级和结合方向的的,当优先级相同时,按照运算符结合方向进行运算,下面将介绍不同种类的运算符与其优先级和结合性。

先看这个表  

在相同的优先级情况下 我们可以加()来进一步帮助我们理解结合的顺序

然而()可以改变运算的顺序,类比数学中的运算

c语言中表达式和操作符详解_第1张图片

我们也可以直接将右结合性的运算符记忆下来

分别有:一元运算符,强制类型转换操作符,赋值操作符,三目操作符

在看这个表 接下来我们将会按照这个表对操作符进行详细的解释

c语言中表达式和操作符详解_第2张图片

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也一样

c语言中表达式和操作符详解_第3张图片

2 关系运算符 

> ,<,==,>=,<=,!=

关系运算符的优先级低于算数运算符

这里在介绍一下关系表达式

关系表达式的结果只有两个 真和假,非零为真,零为假   看下面的例子

这里的!是逻辑非,是一级运算符,后面会介绍

c语言中表达式和操作符详解_第4张图片c语言中表达式和操作符详解_第5张图片

当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 条件运算符

? :

看下面的例题:

c语言中表达式和操作符详解_第6张图片

  这大哥最厉害了 是唯一一个三目 操作符 (回想一下啥是目)

下面介绍一下怎么使用它,先看一个例子           你是大牛吗?走向人生巅峰:好好学习成为大牛

这里“你是大牛吗”为表达式一 ,当真的时为候执行表达式二“走向人生巅峰”,当为假的时候执行表达式三“好好学习成为大牛”

5 赋值运算符 

=    具有右结合性 。要注意的是左侧只能为变量

c语言中表达式和操作符详解_第7张图片

6 逗号运算符 

 , 在c语言中一般做分隔符  就是将参数分开

下面是摘抄的 

c语言中,分隔符有逗号、空白符、分号和冒号。 (1)逗号作为分隔符用来分隔多个变量和函数参数; (2)空白符常用来作为多个单词间的分隔符,也可以作为输数据时自然输入项的缺省分隔符; (3)分号常用于for循环语中for后面,圆括号内的三个表达式之间;

这里说一下 空白符  如 int a;  inta;      前一个是两个单词 而后一个是一个单词意义不一样

逗号表达式 :用逗号将表达式隔开的 并且将最后一个表达式的值最为最终的值

7 位运算符(位运算符的操作对象均为二进制位)

~, >>, << ,&, | ,^,分别为  按位取反, 右移位, 左移位, 按位与, 按位或, 按位异或

这里~的结合性为右结合性 

下面一一介绍他们的用法

~   按位取反   按位取反的对象是补码,并且符号位也要取反。但是在负数的原码变反码的过程中符号位不需要按位取反

看下面的例子:

c语言中表达式和操作符详解_第8张图片

内存中存储的整数的时候存储的是二进制位补码

计算的时候也是用二进制补码算

但是打印的时候是用原码算

>> 右移位 分为算术右移和逻辑右移    (移几位就相当于除了几个二)               

算术右移:舍弃移出的位数 左边补符号位

逻辑右移:舍弃移出的位数,左边补零 

<<   只有逻辑左移

&   按位与 有一个是零结果就是零,全为一才是一。 看下面的例子:

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语言中的关键字 作用是计算变量或者数据类型在内存单元中所占的长度(也就是字节数)

看下面的例子:

c语言中表达式和操作符详解_第9张图片

变量a的类型是整形,所以占4个字节,数组arr[10]里面有10个元素,每个元素的类型是整形所以占40个字节,而数据类型Int占用4个字节

这里有一个易混点就是运算符sizeof()与函数strlen()

看名字就知道他俩不一样 一个是求变量和数据类型所占的字节数的运算符,一个是计算字符串长度的函数 

先不充一波字符串的知识  顾名思义字符串就是有一堆字符组合起来的 但是字符串他得有个结束标志吧?

于是就规定了\0为字符串的结束标志,在计算字符串的长度时,不算做内容,但是要占内存

下面来介绍他们两个的区别

先看这个图

c语言中表达式和操作符详解_第10张图片

图中显示 sz=7   ,str=6

这是为什么呢?

首先看数组a的类型是字符类型 ,我们知道字符类型的数据所占的字节为1,而hellow只有六个字符,为什么会打印出7呢?这就和上面那个补充的知识连接起来了   \0也会占用内存所以会打印出7

这里介绍一下strlen()函数 :它的作用是计算字符串中\0前面字符的个数,它遇到\0会停止并将\0前面字符的个数返回去 所以会打印6

9 强制类型转换

强制类型转换定义: 就是将变量从一种类型转换成另外一种类型  。 功能:把表达式的结果强制转化为类型说明符所表示的类型。

(类型说明符)表达式       看下面的例子:

c语言中表达式和操作符详解_第11张图片

这里将字符变量a的地址放在double类型的指针变量pa里,会出现 char*类型与double*不兼容的报错,但是将变量a强制转化为double类型就不会报错

10 下标引用操作符,函数调用操作符

[]   访问数组中的某个元素   如 int arr[5]={1,2,3,4,5};  arr[4] 表示数组中第5个元素。

() 调用函数 看下面的例子

c语言中表达式和操作符详解_第12张图片

你可能感兴趣的:(c语言)