一、运算符分类
二、算术运算符与算术表达式
三、关系运算符与关系表达式
四、逻辑运算符与逻辑表达式
五、赋值运算符
六、sizeof运算符
七、运算符优先级
一、运算符分类
C语言提供了13种类型的运算符,如下所示:
(1)算术运算符
(2)关系运算符
(3)逻辑运算符
(4)位运算符
(5)赋值运算符
(6)条件运算符
(7)逗号运算符
(8)指针运算符
(9)求字节运算符
(10)强制类型转换
(11)分量运算符
(12)下标运算符
(13)其他
二、算术运算符以及算术表达式
1.原理
算术运算符包含+、-、*、/和%,当一个表达式中同时出现这5种运算符时,先进行乘(*)、除(/)、取余(%)、取余也叫取模,后进行加(+)、减(-),也就是乘、除、取余运算符的优先级高于加、减运算符。除%运算符外,其余几种运算符既适用于浮点型数,又适用于整型数,当操作数/的两个操作数都是整型数时,他执行整除运算,在其他情况下执行浮点型数除法,%为取模运算符,他接收两个整型操作数,将左操作数除以右操作数,但它的返回值是余数而不是商,由算术运算符组成的式子称为算术表达式,表达式一定会有一个对应的值。
2.代码
#include<stdio.h>
int main(){
int result=4+5*2-6/3+11%4;
printf("result=%d\n",result);
return 0;
}
运行结果:
三、关系运算符与关系表达式
- 原理
关系运算符>、<、==、>=、<=、!=依次为大于、小于、等于、大于等于、小于等于、不等于
由关系运算符组成的表达式称为关系表达式、关系表达式的值只有真与假,对应的值为1与0,由于c语言中没有boolean类型,所以在c语言中0代表假,非0就是真,例如:关系表达式3>4为假,因此整体值为0,而关系表达式5>2为真,因此整体值为1,关系运算符的优先级低于算术运算符。
- 代码
#include<stdio.h>
int main(){
int a;
while(scanf("%d",&a)){
if(3<a&&a<10){
printf("a在3与10之间");
} else{
printf("a不在3与10之间");
}
}
return 0;
}
运行结果:
四、逻辑运算符与逻辑表达式
1.原理
逻辑运算符!、&&、||依次为逻辑非、逻辑与、逻辑或,这和数学上的与、或、非是一致的、逻辑非的优先级高于算术运算符,逻辑与和逻辑或的优先级低于关系运算符,逻辑表达式的值只有真与假,对应的值为1与0。
2.代码
#include<stdio.h>
#include<stdlib.h>
int main(){
int i;
while(scanf("%d",&i)){
if(i%4==0 && i%100!=0 || i%400==0 ){
printf("i is leap year\n");
}else{
printf("i is not leap year\n");
}
}
return 0;
}
运行结果
五、赋值运算符
1.原理
为了理解有些操作符存在的限制,必须理解左值(L-value)和右值(R-value)之间的区别,这两个术语多年前由编译器设计者创造并沿用至今,尽管他们的定义与C语言并不严格吻合。
左值是那些能够出现在赋值符号左边的东西,右值是那些·可以出现在赋值符号右边的东西。
例如:a=b+25;
其中,a是一个左值,因为它标识了一个存储结果值的地点:b+25是一个右值,因为它指定了一个值。
b+25=a;
这种是不对的,因为每个位置都包含一个值,所以原先用作左值的a,此时也可以作为右值,然而,b+25不能作为左值。
因为他并未标识一个特定的位置(并不对应特定的内存空间),因此,上面这条赋值语句是非法的。
2.代码
#include<stdio.h>
int main(){
int a = 1,b=2;
b=a+25;
return 0;
}
3.复合赋值运算符
复合赋值运算符操作是一种缩写形式,使用复合赋值运算符能使对变量的赋值操作变得更加简洁,例如:
iNum = iNum + 5;
对变量iNum的赋值进行操作,值为变量本身与一个整型常量5相加的结果,使用复合语句可以实现同样的操作,例如,上面的语句可以修改为
iNum+=5;
赋值运算符与复合赋值运算符的区别如下:
(1)复合赋值运算符简化了程序,可使程序精炼,提升阅读速度。
(2)复合赋值运算符提高了编译效率。
#include<stdio.h>
#include<stdlib.h>
int main(){
int iNum,iResult;
iNum=10;
iResult=3;
iNum+=5;
iResult*=iNum;
printf("iNum=%d\n",iNum);
printf("iResult=%d\n",iResult);
return 0;
}
运行结果
六、字节运算符sizeof
很多同学会认为sizeof是一个函数,这种理解是错误的,实际sizeof是一个运算符,不像其他运算符,sizeof是字母组成的,用于求常量或变量所占用的空间大小。
#include<stdio.h>
int main(){
int i = 0;
printf("i size is %d\n",sizeof(i));
return 0;
}
运行结果:
七、优先级表
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 从左到右 |
|
{} | 圆括号 | (表达式)/函数名(形参表) |
| ||
. | 成员选择(对象) | 对象.成员名 |
| ||
-> | 成员选择(指针) | 对象指针->成员名 |
| ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 |
| ||
sizeof | 长度运算符 | sizeof(表达式) |
|
3 | / | 除 | 表达式/表达式 | 从左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 从左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 从左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 |
6 | > | 大于 | 表达式>表达式 | 从左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 从左到右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 从左到右 | 双目运算符 |
9 | ~ | 按位异或 | 表达式~表达式 | 从左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 从左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 从左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 从左到右 | 双目运算符 |