运算符和表达式
当变量被定义成某一种类型后,就会被分配到存储空间,以便后续对其加工。所谓加工,就是运算,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'对应的存储形式则如下:
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
每个二进制位称为一个比特,又称位,这是字符'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 | =、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|= | 自右至左 |