在C语言的表达中,操作符有着很重要的作用
今天来总结一下常见的C语言
操作符
算数操作符
+ - * / %
1、
%两个必须都是整数,返回整除后的余数。除了%操作符之外,其他几个操作符可以作用于整数和浮点数。
2、对于/ 如果两个操作数是整数,作整除取整数位,有浮点数执行的是除法。
3、+ - *类似数学运算。
移位操作符
<<
左移操作符
>>
右移操作符
<< 左移操作符:
移位规则:
左边抛弃、右边补0
假设存放i=2在8字节中 i的二进制是“0000 0010”,
i<<1;
i的二进制是“0000 0100”即是向左移1位,左边第一位的0舍去最右边补0.
>> 右移操作符:
移位规则:
分两种:
1、逻辑位移
左边补0,右边丢弃
2、算数位移
左边补该值的符号位(如负数符号位是1那么补1,整数符号位是0那么补0),右边丢弃
!对于位移运算符,不可移动负数位,这个是标准未定义的。
位操作符
& | ^
!不可作用浮点型
& :
按位与, 如 a=0011
b=0101
c=a&b, c=0001 (按位同1为1 同0为0 相异为0)
| :
按位或, 如 a=0011
b=0101
c=a | b c=0111 (按位有1为1 同1为1 同0为0)
^:
按位异或,如a=0011
b=0101
c=a^b c=0111(按位相异为1 同0为0 同1为1)
小插曲:用^实现两数交换
a=5;
b=9;
a=a^b;
b=a^b;
a=a^b;
a=9;
b=5;
ps: 只能交换整数
赋值操作符 =
复合赋值操作符
+= -= *= /= %= >>= <<= &= |= ^=
先运算再赋值
单目操作符
! 逻辑反操作 int i=2;int j=0; 那么!i=0;!j=1;
- 负值
+ 正值
& 取地址 int i=2;int* p=&i; p中放的i的地址
sizeof sizeof() 操作数的类型长度(字节), sizeof编译时就完成,是类型运算。
~ 对一个数的二进制按位取反
++ 前置、后置++, i++ 等同i=i+1,先使用i 再自增。++i, 先自增再使用i。
-- 前置、后置--,
* 间接访问操作符(解引用操作符)int a=6;int *p=&a;int b=*p; *p就是引用地址变量p所指向的a的值
(类型) int n=6; float c=(float)a;c=6.000000
关系操作符
> >= < <= != ==
!=
:判断不相等,不相等返回1,相等返回0。
==:判断相等,相等返回1,不相等返回0。
逻辑操作符
&& : 逻辑与
|| : 逻辑或
int i=0, a=0, b=2, c=3, d=4;
c=a++&&b++;输出c=0,a=1,b=2
d=++a||++b;输出d=1,a=1,b=2
a&&b a假则结束不运算b,因为a若是假,不论b取何值 a&&b都为0
a||b a真则结束不运算b,因为若a为真,不论b取何值 a||b都为1
条件操作符
exp1 ? exp2 :exp3
判断表达式1是否成立, 是 则执行表达式2,否 则执行表达式3.
逗号表达式
exp1,exp2,exp3,…expN
用逗号隔开多个表达式,从左到右依次执行,但是整个表达式的结果取最后一个表达式的结果。
下标引用、函数调用和结构成员
1、[]
操作数:一个数组名+一个索引值
arr[i]等价于i[arr]因为[]是操作符,两个操作数可交换
2、()
函数调用操作符
接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3、访问一个结构的成员
. 结构体.成员名
->结构体指针->成员名