目录
移位操作符、位操作符均需了解补码的知识,不太懂的可看我这篇文章http://t.csdn.cn/hURbd
算术操作符
+ - * / %
除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
/ :对于 / 操作符如两个操作数都为整数,执行整数除法(向下取整)。而只要有浮点数执行的就是浮点数除法。
% (取模) :操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
<< 左移操作符>> 右移操作符这里的操作都是基于补码
<<(左移操作符)
移位规则:左边抛弃、右边补0
注意:此时num的值不发生改变,num<<1的十进制值为20
我们将二进制转换为十进制会发现一个规律:
原 :1010 =1*2^3+1*2^1
左移1位:10100=1*2^4+1*2^2=(1*2^3+1*2^1)*2
可得:左移n位的十进制数就是在原数上乘2的n次方(移动位数不能太大要注意是否溢出)
>>(右移操作符)
移位规则:
![](https://i-blog.csdnimg.cn/blog_migrate/c74b55a3d8f2b687e3a8305f69abcf9a.png)
注意:此时num的值依然不发生改变
由左移的推论同理可得:右移n位的十进制数就是在原数上除2的n次方向下取整
位操作符
& //按位与
| // 按位或^ // 按位异或注:他们的操作数必须是整数,这里的操作同样是基于补码
&(按位与)
运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。
例:3&9
3的二进制:0011
9的二进制:1001
3&9的结果:0001
即3&9 = 1
|(按位或)
运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。
例:3&9
3的二进制:0011
9的二进制:1001
3&9的结果:1011
即3&9 = 11
^(按位异或)
运算规则:参加运算的两个数,对应二进制位相同为0,相异为1。
例:3&9
3的二进制:0011
9的二进制:1001
3&9的结果:1010
即3&9 = 10
特点:
1、n^0都等于n
如:3^0
3的二进制:0011
0的二进制:0000
3^0的结果:0011
即3^0 = 3
2、n^n等于0
如:3^3
3的二进制:0011
3^3的结果:0000
即3^3 = 0
3、^满足交换律
如:3^9^3 = 3^3^9 = 0^9 = 9
赋值操作符
= += -= *= /= %= >>= <<= &= |= ^=
单目操作符
单目操作符是 只接受一个操作数的操作符! 逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)注:这不是函数~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )(类型) 强制类型转换
~(按位取反)
运算规则:对数的二进制每一位按位取反
例:~9
9的二进制补码:0(符号位)1001
~9的结果 :1(符号位)0110
即~9 = -10
对于所有整数取反=其本身的相反数-1
--或++(前置、后置)
前置:先对操作数进行自减(即-1)或自增(即+1),然后使用操作数
例:
int a = 10
int x = ++a;
a = 11 x = 11
先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。
例:int a = 10;int x = a++;a = 11 x = 10先对a先使用,再自增,这样x的值是10;之后a变成11
关系操作符
>>=<<=!= 用于测试“ 不相等 ”== 用于测试“ 相等 ”
逻辑操作符
&& 逻辑与|| 逻辑或
&&(逻辑与)
运算规则:若操作符两侧的条件均为真即为真(返回1),任意条件为假即为假(返回0)
注意:&&左边若为假,右边就不计算了
例: int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
此时a = 1, b = 2, c = 3, d = 4
|| (逻辑或)
运算规则:若操作符两侧的任意条件真即为真(返回1),条件均为为假即为假(返回0)
注意:||左边若为真,右边就不计算了
例:int i = 0,a=0,b=2,c =3,d=4;
i = a++||++b||d++;
此时a = 1, b = 3, c = 3, d = 4
条件操作符
exp1 ? exp2 : exp3
条件操作符也叫三目操作符
例:
if (a > 5)
b = 3;
else
b = -3;
//以上代码可改写为
(a > 5) ? (b = 3) : (b = -3);
//或者写为
b = (a > 5) ? 3 : -3;
逗号表达式
exp1, exp2, exp3, …expN
运算规则:从左向右依次执行,整个表达式的结果是最后一个表达式的结果
举个例子让大家更好理解
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
从左往右依次计算,a>b为假,a = b + 10 = 12, a = 12, b = a + 1 = 13
可得c = 13
下标引用、函数调用和结构成员
[ ]下标引用操作符
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
( ) 函数调用操作符
#include <stdio.h>
int add (int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
add(a,b);//这里的()就是函数调用操作符,操作数为 add , a , b 这三个
return 0;
}
结构成员访问操作符
. 结构体 . 成员名-> 结构体指针 -> 成员名
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void print_age1(struct Stu stu)
{
printf("%d",stu.age)// . 结构成员访问(用于结构体)
}
void print_age2(struct Stu* pStu)
{
printf("%d",pStu->age)// -> 结构成员访问(用于结构体指针)
}
int main()
{
struct Stu stu = 20;
struct Stu* pStu = &stu;
print_age1(stu);
print_age2(pStu);
return 0;
}