操作符的分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
一、算数操作符
运算符 | 含义 | 举例 | 结果 |
+ | 加法运算符 | a+b | a与b的和 |
- | 减法运算符 | a-b | a与b的差 |
* | 乘法运算符 | a*b | a与b的积 |
/ | 除法运算符 | a/b | a除b的商 |
% | 求余运算符 | a%b | a除b的余数 |
注:
1、除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2、对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3、%操作符的两个操作数必须为整数。返回的是整除之后的余数。
二、 移位操作符
<< 左移操作符
>> 右移操作符
1、左移操作符的移位规则:左边抛弃,右边补0。(左移一位相当于乘2)
2、右移操作符的移位规则:(右移一位相当于除2)
(1)逻辑右移
左边用0填充,右边丢弃。
(2)算术右移
左边用原该值的符号位填充,右边丢弃。
注:计算机采用的是算术右移;对于移位运算符不能移动负数位。例如a>>-2,这种表达方式是错的,应该写为a<<2。
三、位操作符
运算符 | 含义 | 说明 |
& | 按位与 | 对应的二进制序列进行相与,两个同时为1时得1其他为0 |
| | 按位或 | 对应的二进制序列进行相或,两个至少有一个为1时得1其他为0 |
^ | 按位异或 | 对应的二进制序列进行相异或,相同为0,不同为1)
|
注:1、获取二进制位现将其移到最低位,再按位&,|,^,操作;
2、它们的操作数必须为整数。
四、赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
1、赋值运算符:
赋值符号 = 就是赋值运算符,它的作用是将一个数据赋值给一个变量。如:int a = 3;//把常量3赋给变量a。
2、复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
举例加以说明:
a+=1 等价于 a = a + 1
a-=1 等价于 a = a -1
a*=1 等价于 a = a * 1
五、单目操作符
运算符 | 含义 |
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
-- | 自减运算符 |
++ | 自增运算符 |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
注:
1、自增、自减运算符:(举例说明)
(1)前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a; //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
int y = --a; //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10。
return 0;
}
(2)后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10;
return 0;
}
2、& 取地址:(举例说明)
Printf(“%p\n”,&a); //对变量取地址
Printf(“%p\n”,&arr); //表示数组的地址
Printf(“%p\n”,&arr + 1); //地址增加了40
Printf(“%p\n”,arr); //表示数组首元素的地址
Printf(“%p\n”,arr+1); //地址增加了4
注:&数组名,表示整个数组,除此之外数组名表示首元素地址。
3、sizeof操作数的类型长度(以字节为单位)
(1)sizeof求变量和函数类型的大小
int a=4;
printf(“%d”\n, sizeof(a)); //4
printf(“%d”\n, sizeof(int)); //4
注:sizeof不是函数,当sizeof求取一个变量所占空间的大小时,其两边的括号可以省略(如:sizeof a);如果是求函数所占空间的大小,其两边的括号不可以省略。
(2)sizeof求数组的大小
int arr[10] = {0};
Printf(“%d\n”,sizeof(arr)); //40(数组名单独放在sizeof内部,数组名表示整个数组)
Printf(“%d\n”,sizeof(arr+0)); //4(数组名不单独放在sizeof内部表示首元素地址)
(3)放在sizeof内部的表达式不会参与运算(举例说明)
#inciude <stdio.h>
int main()
{
int a = 1;
short s=3;
printf(“%d\n”,sizeof(s=a+5)); //2
printf(“%d”\n,a); //1
printf(“%d”\n,s); //3
return 0;
}
4、指针++
int *p = (int * );
printf(“%d”,p); //0x0012ff40
printf(“%d”,++p); //0x0012ff44
5、(类型)强制类型转换
int a = 10;
a = (int)3.14;
6、~ 对一个数的二进制位按位取反
#include<stdio.h>
int main()
{
Int a=0;
Printf(“%d\n”,~a); //-1
Return 0;
}
六、关系操作符
> >= < <=
!= //用于测试“不相等”
== //用于测试“相等
注:我们将判断的 == 搞成了赋值的 = ,这样这个事务无论x是多少都会被执行,所以切记不要写错了。
七、逻辑操作符
运算符 | 含义 | 举例 | 说明 |
&& | 逻辑与 | a&&b | 如果a和b都为真,则结果为真,否则为假 |
|| | 逻辑或 | a||b | 如果a和b都有一个为真,则结果为真,二者都为假,结果为假 |
! | 逻辑非 | !a | 如果a为假,则!a为真,如果a为真,则!a为假 |
注:要区分逻辑与和按位与,区分逻辑或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
例:#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++&&++b&&d++;//当第一个&&左边为假时则右边的不参与运算
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);//1 2 3 4
//i = a++||++b||d++;//当第一个||左边为真时则右边的不参与运算
//printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);//1 3 3 4
return 0;
}
八、条件操作符
exp1 ? exp2 : exp3
举例说明:
if(a>b)
max = a;
else
max = b;
可以把上边的if语句改写为:max=(a>b)? a :b;
九、逗号表达式
exp1, exp2, exp3, …expN
注:
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
十、下标引用、函数调用和结构成员
1. [ ]操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
arr[9] = 10;//使用下标引用操作符。
[ ]的两个操作数是arr和9。
2. ()函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名 //(*p)age=20; 等价于 p->age=20;
附:运算符和结合性
优先级 | 运算符 | 含义 | 要求运算对象的个数 | 结合方向 |
1 | () | 圆括号 |
| 自左至右 |
[] | 下标运算符 | |||
- > | 指向结构体成员的运算符 | |||
. | 结构体成员运算符 | |||
2 | ! | 逻辑非运算符 | 1 (单目运算符) | 自右至左 |
~ | 按位取反运算符 | |||
++ | 自增运算符 | |||
-- | 自减运算符 | |||
- | 负号运算符 | |||
(类型) | 类型转换运算符 | |||
* | 指针运算符 | |||
& | 取地址运算符 | |||
sizeof | 长度运算符 | |||
3 | * | 乘法运算符 | 2 (双目运算符) | 自左至右 |
/ | 除法运算符 | |||
% | 求余运算符 | |||
4 | + | 加法运算符 | 2(双目运算符) | 自左至右 |
- | 减法运算符 | |||
5 | << | 左移运算符 | 2(双目运算符) | 自左至右 |
>> | 右移运算符 | |||
6 | < <= > >= | 关系运算符 | 2(双目运算符) | 自左至右 |
7 | == | 等于运算符 | 2(双目运算符) | 自左至右 |
!= | 不等于运算符 | |||
8 | & | 按位与运算符 | 2(双目运算符) | 自左至右 |
9 | ^ | 按位异或运算符 | 2(双目运算符) | 自左至右 |
10 | | | 按位或运算符 | 2(双目运算符) | 自左至右 |
11 | && | 逻辑与运算符 | 2(双目运算符) | 自左至右 |
12 | || | 逻辑或运算符 | 2(双目运算符) | 自左至右 |
13 | ? : | 条件运算符 | 2(三目运算符) | 自右至左 |
14
| = += -= *= /= %= >>= <<= &= ^= |= | 赋值运算符 | 2(双目运算符) | 自右至左 |
15 | , | 逗号运算符(顺序求值运算符) |
| 自左至右 |