前言
本文章主要讲解点:
- 各种操作符的介绍
- 表达式求值
操作符
分类:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
注意:
其中移位操作符和位操作符都是对数据在内存中储存的二进制序列进行操作
算术操作符
+ - *(乘法) /(除法) %(取余)
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法(相当于取余返回整数值)
而只要有浮点数执行的就是浮点数除法
3. % 操作符的两个操作数必须为整数返回的是整除之后的余数
移位操作符
>> 右移操作符
<< 左移操作符
左移操作符移位规则
左边抛弃、右边补0
右移操作符移位规则
首先右移运算分两种:
1. 逻辑移位 左边用0填充,右边丢弃
2. 算术移位 左边用原该值的符号位填充,右边丢弃
注意 : 对于移位运算符,不要移动负数位,这个是标准未定义的
int num = 10; num>>-1;//error
大小的变化
左移:每左移一位,相当于乘2
右移:每右移一位,相当于除2
位操作符
& //按位与 (两数二进制位都为1 —>1)
| //按位或 (两数二进制位有一个为1 —>1)
^ //按位异或 (两数二进制位不同为1,相同为0)
注:他们的操作数必须是整数
一道有意思的例题
不能创建临时变量(第三个变量),实现两个数的交换
#include <stdio.h> int main() { int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %d\n", a, b); return 0; }
异或(^)的特点
1.两数相同,异或为0
2.0与任何数异或,还是这个数
3.(从上面来看可以说)一个数异或另一个数两次还是原数
赋值操作符
复合赋值符
赋值操作符可以与其他操作符连用,形成复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
- 使用举例
int x = 10; x = x+10; x += 10;//复合赋值 //其他运算符一样的道理。这样写更加简洁
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
单目操作符即只有一个操作元素
多少目即操作符需要带上多少个数据
对于sizeof操作符
求变量(类型)所占空间的大小
printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a);//这样写行不行? 可以 printf("%d\n", sizeof int);//这样写行不行? 不可以
与数组结合时: int arr[3] = {1,2,3} sizeof(arr) 结果为12(arr表示整个数组) sizeof(arr+0)//或者sizeof(arr[0]) 结果为4(表示首元素地址)
注:sizeof不是函数,是关键字是,是操作符
对于++/--操作符
//++和--运算符 //前置++和-- //前置++和--: #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; } //后置++和-- #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; }