总结一下C语言操作符总结
一、算术操作符。
+ - * / %
注意:
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
二.移位操作符
<< 左移操作符
>> 右移操作符
(1)左移操作符:移位规则:左边抛弃、右边补0
例如:
9在内存中的二进制数为 0000 0000 0000 0000 0000 1001
左移一位为 0000 0000 0000 0000 0001 0010
注意:在进行移位操作时,是对一个整数的二进制补码进行移位。
(在计数机中数据以二进制补码的形式存储。正数的原码、反码、补码相同,负数的补码形式是在原码的条件下除符号位其他全部取反,再加1。)
int a =10;
b=a<<1;
可以得到b=20,a还是10。可以看出左移操作具有乘以2的效果,a的值本身不变。
(2)右移操作符:移位规则:首先右移运算分两种:
- 逻辑移位:不需要考虑符号产生的问题左边用0填充,右边丢弃
例如:
-1在内存中的二进制数为 1111 1111 1111 1111 1111 1111
逻辑右移一位为 0111 1111 1111 1111 1111 1111
- 算术移位:二进制数有正负之分,补位时要注意符号位,左边用原该值的符号位填充,右边丢弃
(实际应用中,算术移位用的比较多,因为逻辑移位如果是一个负数,移完之后会变为一个正数,误差太大。)
右移操作也可以用来计算二进制中为“1”的比特位。
将一个32位的二进制数的末位依次右移,然后和1按位与,如果得到的结果为1,则说明原数末位为1,否则为0.
注意:对于移位运算符,移动负数位是没有意义的。
例如:
-1在内存中的二进制数为 1111 1111 1111 1111 1111 1111
算术右移一位为 1111 1111 1111 1111 1111 1111
注意:
1.左移操作相当于/2;右移操作相当于*2。
2.对于移位运算符,不要移动负数位
三.位操作符
& //按位与(遇0则0)
| //按位或(遇1则1)
^ //按位异或 (相同为0,相异为1)
注:他们的操作数必须是整数。
四.赋值操作符
1.赋值操作符在之前的程序代码中经常出现,赋值操作符连续赋值
= //赋值运算符
注意在连续赋值时,应从右往左赋值,
例如:
a=x=y+1;
输出时a的值就应是y+1。
2.复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
五.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
数组名——是一个数组中首元素的地址
&数组名——是指整个数组的地址
sizeof () 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置--(先赋值,后运算)
后置--(先运算,后赋值)
++ 前置++(先赋值,后运算)
后置++ (先运算,后赋值)
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:1.sizeof是一个操作符,它不是一个函数。
2.sizeof内部表达式不参与运算。
(源文件要变成可执行文件需要通过编译和执行两个过程,sizeof操作符是在编译时就可以得知数的类型的字节数,在编译阶段还没有创建a,s的变量,所以s得值还是原来的值,并没有将10+8的值赋给s。)
3. sizeof可以求变量(类型)所占的空间大小。
eg: sizeof( a ) / sizeof( a[ 0 ] )可以求一个数组的大小。
4.sizeof(short)求变量类型所占的空间大小(short所占空间大小为2)
六.关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 用于测试“不相等”
== 用于测试“相等”
注意== 和=不小心写错
七.逻辑操作符
&& 逻辑与(将两个表达式连接成一个。两个表达式必须都为 true,整个表达式才为 true)
|| 逻辑或(将两个表达式连接成一个。必须有一个或两个表达式为 true,才能使整个表达式为 true)
注意
1.如果 && 运算符左侧的子表达式为 false,则不会检查右侧的表达式。
2.如果 || 运算符左侧的子表达式为 true,则右侧的子表达式将不被检查。
*区分逻辑与(&&)和按位与(&)
*区分逻辑或( || )和按位或( | )
例如:
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
八.条件操作符
exp1 ? exp2 : exp3
例如
int a=10;
int b=20;
int c=a>b?a:b
结果:c=20
九.逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达 式的结果
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
结果:c=13
if (a =b + 1, c=a / 2, d > 0)
相当于 if(d>0)
十.下标引用、函数调用和结构成员
1.[ ] 下标引用操作符 操作数:一个数组名 + 一个索引值
例如:
int arr[10];//创建数组
arr[0] = 0;//实用下标引用操作符。
[ ]的两个操作数是arr和0。
2.函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
scanf();
printf();
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
十一.操作符优先级
1、优先级1级
结合方向 左结合(自左至右)
( ) 圆括号
[ ] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符 [1] (请注意它是一个实心圆点)
2、优先级2级
结合方向 右结合(自右至左)单目运算符
! 逻辑非运算符
~ 按位取反运算符
++ 自增运算符
-- 自减运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 地址与运算符
sizeof 长度运算符
3、优先级3级
结合方向 左结合 双目运算符
* 乘法运算符
/ 除法运算符
% 取余运算符
4、优先级4级
结合方向 左结合 双目运算符
+ 加法运算符
- 减法运算符
5、优先级5级
结合方向 左结合 双目运算符
<< 左移运算符
>> 右移运算符
6、优先级6级
结合方向 左结合 双目运算符
<、<=、>、>= 关系运算符
7、优先级7级
结合方向 左结合 双目运算符
== 等于运算符 (判断)
!= 不等于运算符(判断)
8、优先级8级
结合方向 左结合 双目运算符
& 按位与运算符
9、优先级9级
结合方向 左结合 双目运算符
^ 按位异或运算符
10、优先级10级
结合方向 左结合 双目运算符
| 按位或运算符 举例:0xfe|0xef 即为1111 1110 与1110 1111按位或运算则答案为:1111 1111 即0xff。
11、优先级11级
结合方向 左结合 双目运算符
&& 逻辑与运算符
12、优先级12级
结合方向 左结合 双目运算符
|| 逻辑或运算符
13、优先级13级
结合方向 右结合 三目运算符
? : 条件运算符
14、优先级14级
结合方向 右结合 双目运算符
= 赋值运算符
+ = 加后赋值运算符 如s+=1表示s=s+1
- = 减后赋值运算符 如s-=1表示s=s-1
* = 乘后赋值运算符
/ = 除后赋值运算符
% = 取模后赋值运算符
< <= 左移后赋值运算符
>>= 右移后赋值运算符
&= 按位与后赋值运算符
^= 按位异或后赋值运算符
|= 按位或后赋值运算符
15、优先级15级
结合方向 左结合
, 逗号运算符