运算符和表达式

本文详细介绍了C语言中的各种运算符,包括算术运算符(加减乘除、取余)、赋值运算符(简单与复合)、关系运算符、逻辑运算符、位运算符以及求字节数运算符sizeof和强制类型转换,讨论了运算符的优先级和结合性。
摘要由CSDN通过智能技术生成

运算符和表达式 

当变量被定义成某一种类型后,就会被分配到存储空间,以便后续对其加工。所谓加工,就是运算,C语言中常见的运算就有加、减、乘、除等。参加运算的数据叫做运算量,也被称之为运算对象。由运算符将运算对象连接起来的的式子叫做表达式。eg:"sum=a+b;"

C语言是一种强大并且应用广泛的高级语言,包含的运算符非常丰富,具体可分为以下:

运算符
类别介绍运算符
算术运算符用于一般的加减乘除运算+、-、*、/、%
赋值运算符对变量进行赋值=、+=、-=、*=、/=、%=
关系运算符用来对两个操作对象进行比较判断<、>、>=、<=、==、!=
逻辑运算符用来进行逻辑判断&&、||、!
位运算符用来实现对计算机中二进制代码进行操作<<、>>、~、|、^、&
求字节数运算符 用来实现求数据所占空间的大小sizeof
强制类型转换运算符用来实现将一种数据类型强制转化成另一种数据类型没有固定的运算符号
逗号运算符用来实现连接多个表达式
条件运算符进行条件是否满足的判断?:
指针运算符用来实现取值或取地址*、&
分量运算符用来取结构体变量的某一份量值.、->
下标运算符[]

算术运算符

常见的算术运算符

 所谓算术运算符就是我们生活中常见的加(+)、减(-)、乘(*)、除(/)、取余(%)。

值得注意的是这里两个数相除求商与我们生活中有所不同:当两个数相除,商的结果取整,舍去小数部分。如3/2结果为1,-3/2结果是-1。这种取整方法被称之为"向零取整",即取整后向零的方向靠拢。当然,也有少数机器采用"四舍五入",即5/2=3。

上述的五个运算符需要两个对象才可以运算,被称之为双目运算符。

自增、自减运算符

自增运算符++:使变量的值增1

自减运算符--:使变量的值减1

#include <stdio.h>
int main()
{
    int a=1,b,c,d,e;
    b=a++;//先将a的值赋值给b,然后a增1,结果是b为1,a为2
    c=++b;//先将b增1,b为2,再赋值给c,c也为2
    d=c--;//先将c的值赋值给d,d为2,然后c减1,c为1
    e=--c;//先使c减1,c为0,然后c的值赋值给e,e为0
    printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);
    return 0;
}

输出结果: 

  

值得一提的是:在C语言中有一些特殊的运算符只需要一个操作对象即可进行运算,称之为单目运算符,如取正运算符(+)、取负运算符(-)。自增运算符(++)与自减运算符(--)是两个特殊的单目运算符。

赋值运算符

何为赋值?就是讲一个数据赋给一个变量。如"number=7;"表示将数值常量7赋值给变量number。

简单的赋值运算符

"="就是最常见的赋值运算符。

PI=3.14;:表示将常量3.14赋值给PI。

S=PI*r*r;:表示将表达式PI*r*r赋值给S。

赋值符"="左边一定是一个变量,右边可以是常量,也可以是表达式。表示将右边的常量或表达式赋值给左边的变量。

复合赋值运算符

复合赋值运算符就是在赋值符"="前加上其他运算符,如+=、-=、*=、/=、%=等。

+=:如a+=b,相当于a=a+b。

-=:如a-=b,相当于a=a-b。

以此类推,*=、/=、%=亦是如此。

算术运算符可以和赋值运算符组合成复合赋值运算符:+=、-=、*=、/=、%=,位运算符也可以和赋值运算符构成复合赋值运算符:&=、|=、>>=、<<=、^=。

&=:如a&=b,相当于a=a&b。

>>=:如a>>=b,相当于a=a>>b。

以此类推,|=、<<=、^=亦是如此。

关系运算符

关系运算又称之为比较运算,就是对两个运算量就相比较,判断计较结果是否符合给定条件。

C语言中用于比较的关系运算符有:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)。

逻辑运算符

C语言中逻辑运算符只有三个:逻辑与(&&)、逻辑或(||)、逻辑非(!)。其中逻辑与又称之为逻辑乘,逻辑或又称为逻辑加,逻辑非又被称为取反。

一般的,a&&b,只有当a与b都为真,结果才是真,a与b有一方是假,结果都为假。

一般的,a||b,只要a与b有一方为真,结果就是真,只有a与b都是假,结果才为假。

一般的,!a,表示对a进行取反,若a为真,!a就为假,若a为假,则!a为真。

位运算符

计算机内部,数据都是以二进制0和1的形式存在,例如字符'a'的ASCII码为97(0*61),其对应的二进制形式为1100001,由于字符型数据在系统中占一个字节(即8个二进制位)的存储空间,字符'a'对应的存储形式则如下:

01100001

每个二进制位称为一个比特,又称位,这是字符'a'在计算机中存储的最原始形式,其它类型的数据在计算机中同样也由二进制位构成,就像人体有许多细胞组成的,这里的"位"就是计算机中存储器的细胞。

二进制位进行的运算称为位运算,C语言中位运算符共6个:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、>>(右移)、<<(左移)。

按位与(&)

"按位与"又称"按位乘",即二进制位相乘。规则如下:

0&0=0、0&1=0、1&0=0、1&1=1

不难看出,任何二进制位和0"按位与",结果都是零。

按位或(|)

"按位或"又称"按位加"。规则如下:

0|0=0、0|1=1、1|0=1、1|1=1

不同于"按位与",任何二进制数和1"按位或",结果都是1。

按位异或(^)

"按位异或"简称"异或"运算符,规则如下:

0^0=0、1^0=1、0^1=1、1^1=0

可以看出,参加运算的两个二进制位,同为0,异为1。

取反(~)

顾名思义,该运算符主要用于对一个二进制数按位取反,即将1变成0,0变成1。

左移(<<)与右移(>>)

该类运算符可以用来将一个二进制数向左或向右移动若干位。

如x<<n,表示将数值x所对应的二进制数向左移动n位,高位左移后被舍弃掉,低位补0。

x>>n,表示将数值x所对应的二进制数向右移动n位,移除的低位会被舍弃掉。

逗号运算符(,)

很意外吧,在C语言中,逗号竟然也是运算符。在这里,逗号(,)确实是一个运算符。

逗号表达式的一般形式为:

表达式1,表达式2,表达式3,…,表达式n

那么逗号运算符是如何求结果值的呢?

逗号表达式的求解过程是:先求表达式1,再求表达式2,……直至求出表达式n。

#include <stdio.h>
int main()
{
    int a=3;
    ++a,a+5,a+6;//因为自增运算符在前,所以我们先求++a的值,先使a增1得4;再求表达式a+5=9。需要注意的是:这里的9是a+5的值而不是a的值,a的值仍然是4,然后求a+6的值为10
    printf("a+6=%d\n",a+6);
    printf("a+5=%d",a+5);
    return 0;
}

运行结果:

 

求字节运算符sizeof

如果你想要知道一个数据类型在存储器中所占用的字节数,sizeof会告诉你的。 

#include <stdio.h>
int main()
{
    int l1,l2,l3,l4,l5,l6;
    l1=sizeof(int);
    l2=sizeof(long int);
    l3=sizeof(short);
    l4=sizeof(float);
    l5=sizeof(double);
    l6=sizeof(char);
    printf("int:%d\nlong int:%d\nshort:%d\nfloat:%d\ndouble:%d\nchar:%d",l1,l2,l3,l4,l5,l6);
    
    return 0;
}    

输出结果:

强制类型转换

C语言中提供了特殊的运算符——强制类型转换运算符,它可以根据需要实现数据类型转换。

强制数据类型转换并没有固定的运算符号,一般使用形式如下:

(类型名)(表达式);

#include <stdio.h>
int main()
{
    double x=2.9,y=3.2;
    double z=x+y;
    int m=(int)(x+y);
    printf("z=%f\n",z);
    printf("m=%d",m);
    return 0;
}

 输出结果:

运算符优先级

运算符有优先次序,当一个表达式中涉及多个运算符参加运算时,优先级高的先运算,优先级低的后运算,运算符的优先次序称为运算符的优先级。

当优先级相同时,是自左至右或自右至左计算,称为运算符的结合性。

运算符优先级
优先级运算符结合性
1!、~、++、--、+(取正)、-(取负)、sizeof、类型转换运算符自右至左
2*、/、%自左至右
3+、-自左至右
4<<、>>自左至右
5<、<=、>、>=自左至右
6==、!=自左至右
7&自左至右
8^自左至右
9|自左至右
10&&自左至右
11||自左至右
12=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=自右至左

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值