操作符分类:
1、算数操作符
2、移位操作符
3、位操作符
4、赋值操作符
5、单目操作符
6、关系操作符
7、逻辑操作符
8、条件操作符
9、逗号表达式
操作符 | 名称 | 解释 | 形式 |
+ | 加 | 两数相加 | X+Y |
- | 减 | 两数相减 | X-Y |
* | 乘 | 两数相乘 | X*Y |
/ | 除 | 两数相除取商 | X/Y |
% | 取余 | 两数相除取余数 | X%Y |
2,其他几个操作符可以作用于整数和浮点数,唯有%操作符,两个操作数必须为整数,返回的是整除之后的余数。
二、移位操作符
1, << 左移操作符
解释: 按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
需要注意的是这里移位的是整型数,浮点数不能左移。
2, >> 右移操作符
解释:按二进制形式把所有的数字向右移动对应位移位数
右移位操作符又分为两种:
a,算术右移
算术右移,右边丢弃,左边补符号位
b,逻辑右移
逻辑右移,右边丢弃,左边补0
注意:移位运算符,不要移动负数位,这个是标准未定义的
eg:
int num=10;
num>>-1;//error
三、位操作符
操作符 | 名称 | 解释 | 形式(二进制) |
& | 按位与 | 两个同时为1才为1 | 1100&0110=0100 |
| | 按位或 | 有一个为1则为1 | 1100|0110=1110 |
^ | 按位异或 | 相同为0不同为1 | 1100^0110=1010 |
注意:
1,它们的操作数必须是整数。
2,任何数&1结果如果是1,这说明这个数的最低位为1;如果是0,这说明它的最低位为0。
3,任何数^它本身结果为0
4,任何数^0结果是它本身
四、赋值操作符
赋值运算符的符号为=,是我们写代码不可缺少的操作符,几乎每个代码中都用到了赋值运算符,这里不多做解释,说一下复合赋值符,包括以下:
1, += -= *= /= %=
2, >>= <<=
3, &= |= ^=
这些运算符都可以写成复合的效果。例如:
int x=10;
x=x+10;
x+=10;
其他运算符和它一样,这样写更加简洁。
五、单目操作符
单目运算符包括以下几种:
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度
~ 对一个二进制数按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型)强制类型转换
前面四种相信大家都很熟知,主要说后面的操作符:
1,sizeof
很多同学将其误认为是一个函数,其实它是一个操作符,从以下代码中我们可以清楚的看到:
int num=0;
sizeof(num);//4
sizeof num;//4
我们可以看到sizeof后面没有带括号的时候仍然可以正确的输出,说明它并非是个函数。但切忌出现以下代码:
int num=0;
sizeof(int);//4
sizeof int;//error
sizeof后面直接用类型时一定要带括号,虽然第一种也是对的,但不提倡使用它。毕竟我们写代码是为了让别人更直观的看懂我们的代码。
需要注意的是sizeof内部表达式不参与运算。
2,++,--
这两个操作符都有前置和后置之分,但道理是一样的
比如m=++i;的意思就是先给i自身加1然后再将加完之后的值赋给m,相反的m=i++;是先将i的值赋给m之后再给i自身加1;--也是相同的道理。
总结一下:++或--在前即先+或-再赋值;++或--在后即先赋值后+或-。
六、关系操作符
· >
· <
· >=
· <=
· ==
· !=
这些都比较简单,需要注意的是最后两个:
==切忌以下代码:
int x=get_value();
if(x=5)
刚开始很多人都会犯这样的错误,是因为我们在数学中的习惯,一个=表示赋值,两个=才是真正的=,条件判断的时候一定不能写成上面的代码。!=与我们在数学中也是不一样的。
七、逻辑操作符
操作符 | 名称 | 解释 |
&& | 逻辑与 | 两个表达式都为真才是真,有一个假则是假 |
|| | 逻辑或 | 有一个表达式为真则为真,两个都为假则是假 |
区分逻辑与和按位与
1&2——>0 二进制与
1&&2——>1 两个都是非0则为真
区分逻辑或和按位或
1|2——>3
1||2——>1
八、条件操作符
exp1:exp2?exp3
表示如果exp1位真则执行exp2,如果exp1为假则执行exp3,例如以下代码:
if(age<18)
else printf("已成年");
则以上代码可以等价于以下代码:
age<18:printf("未成年")?pritf("已成年")
九、逗号表达式
exp1,exp2,exp3,......,expN
用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
举个栗子:
int a=1;
int b=2;
int c=(a>b,a=b+10,a,b=a+1);
printf("%d",c);
没错,它的结果是13,首先执行表达式1,a>b虽然是假的但是不影响,然后执行表达式2 a=b+10,这时候a就变成看12,最后执行表达式3 b=a+1;那么b的的结果自然就是13了,然后把13赋给c,那么c的值的确是13。