目录
一、操作符分类
- 算术操作符(+ - * / %)
- 移位操作符(<< >> )
- 位操作符 (& | ^ )
- 赋值操作符(= += -= *= /= %= >>= <<= &= |= ^=)
- 单目操作符(! - + & sizeof ~ -- ++ * (类型))
- 关系操作符(> >= < <= != == )
- 逻辑操作符(&& ||)
- 条件操作符(exp1 ? exp2 : exp3)
- 逗号表达式(exp1, exp2, exp3, …expN)
- 下标引用、函数调用和结构成员([ ] ( ) . ->)
二、操作符详解
1、算术操作符
算数操作符包括五种:+ - * / %
要注意的是:
- 除了 % 操作符之外,其他的几个操作符可作用于整数和浮点数,% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。
2、移位操作符
移位操作符包括两种:<<和>>
要注意的是:
移位操作符的操作数只能是整数。
(1)、左移操作符
移位规则:
左边抛弃、右边补0
移动的是内存中补码的二进制
如下是num<<1的过程
它同样也只是一个简单的运算符,并不会改变num的值,当语句a=num<<1;这时a的值就是左移一格之后的值,num值不改变。
(2)、右移操作符
移位规则:
右移运算分两种:1. 逻辑右移
左边用0填充,右边丢弃
2. 算术右移
左边用原该值的符号位填充,右边丢弃
右移的时候,到底采用的是算术右移,还是逻辑右移,是取决于编译器的!
图示如下:
😉注意:对于移位运算符,不要移动负数位,虽然程序并没有识别出来出错,但是可以发现右移-1并不是左移1的结果,如果在继续试试右移-2、-3等等,会发现结果都是0,这其实是一种错误,只是标准未定义。
int num = 10;
int a,b;
a=num>>-1;//错误
b=num<<1;//正确
printf("%d,%d", a, b);
3、位操作符
位操作符包括三种:
- & //按位与
- | //按位或
- ^ //按位异或
要注意的是:
位操作符的操作数只能是整数。
int a = 3;
int b = -5;
int c = a ^ b;//按位异或 - 对应的二进制位,相同为0,相异为1
//11111111111111111111111111111011 - -5的补码
//00000000000000000000000000000011 - 3的补码
//11111111111111111111111111111000 - 3^-5的结果为补码可以看到符号位为1,所有这是一个负数
//11111111111111111111111111110111 - 对结果的补码-1
//10000000000000000000000000001000 - 取反得到原码,也是3^-5结果的二进制表示,即-8
int d = a | b;//按位或
//11111111111111111111111111111011 - -5的补码
//00000000000000000000000000000011 - 3的补码
//11111111111111111111111111111011 - 3|-5的结果为补码可以看到符号位为1,所有这是一个负数
//11111111111111111111111111111010 - 对结果的补码-1
//10000000000000000000000000000101 - 取反得到原码,也是3|-5结果的二进制表示,即-5
int e = a & b;//按位与
//00000000000000000000000000000011 - 3的补码
//11111111111111111111111111111011 - -5的补码
//00000000000000000000000000000011 - 3&-5的结果为补码可以看到符号位为0,所有这是一个正数,原码、反码、补码相同,所以这也是3&-5结果的二进制表示,即-3
printf("%d %d %d\n", c,d,e);
return 0;
}
4、赋值操作符
赋值操作符:=
复合赋值操作符有: += -= *= /= %= >>= <<= &= |= ^=
赋值操作符可以连续使用的
比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值,运算顺序为y+1的值赋值给x,x的值赋值给a,自右往左赋值。
😉再来看看下面的代码,让你更懂赋值操作符
int main()
{
char c = 5;//只是开辟了一定的空间,这里是一个字节,那么想放什么都可以的嘞,只要这个空间能放下。
printf("%c\n", c);//对于开辟的空间,我放的值是什么,输出的结构控制着他的外显形式
printf("%d\n", c);
return 0;
}
//赋值运算符
int main()
{
int a = 8;
int b = 10;
printf("%d", b = a + 3);//这里的赋值符号右侧值为多少往左侧输送时,整体函数的返回值就是多少。
}
复合赋值操作符,其实就是算术操作符与赋值操作符复合的效果。
例如:
int x = 10;
x = x+10;
x += 10; //复合赋值,与上方相同
5、单目操作符
单目操作符有:
! 逻辑反操作(非)
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
这里介绍一下 ~ 取反操作符
int main()
{
int a = 0;
//00000000000000000000000000000000 - 0在内存中的二进制位(所存的补码)
//11111111111111111111111111111111 - 取反得到新的二进制位
//11111111111111111111111111111110 - 补码减一
//10000000000000000000000000000001 - 取反得到一个二进制形式表示的数,即0取反得到的结果为-1
//
printf("%d\n", ~a);
return 0;
}
在介绍一下++操作符:(点击卡片,了解详情)
前置++与后置++的区别http://t.csdn.cn/ZcTTV
6、关系操作符
关系运算符有:
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不相等
== 相等
注意一下:
在编程的过程中== 和=不小心写错,导致的错误。
7、 逻辑操作符
逻辑操作符有:
&& 逻辑与
|| 逻辑或
&&操作符左边为假,右边 不再计算
|| 操作符左边为真,右边 不再计算
例如:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
我们来看看运行结果:
8、条件操作符
exp1 ? exp2 : exp3
条件操作符就可以看作是一个if else语句结构
if(exp1)
exp2;
else
exp3;
这块语句等同于:exp1 ? exp2 : exp3
例如求两数较大值:
int main()
{
int a, b;
a = 9;
b = 10;
int m = (a > b ? a : b);
printf("%d", m);
}
9、逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10、 下标引用、函数调用和结构成员
1.下标引用操作符:[ ]
操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
[ ]的两个操作数是arr和9。
2.函数调用操作符:( )
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.结构体成员访问操作符: . 和 ->
. 结构体.成员名
-> 结构体指针->成员名
//访问一个结构的成员
struct S {
int num;
char c;
};
void test(struct S* ps) {
printf("%d %c",(*ps).num, (*ps).c);
printf("%d %c", ps->num, ps->c); //使用方式:结构体指针->结构体成员名
}
int main()
{
struct S s = { 100,'b' };//结构体的初始化要使用{ }。
printf("%d %c", s.num,s.c);//使用方式:结构体变量.结构体成员名
test(&s);
return 0;
}
三、表达式求值(操作符的使用)
1、复杂表达式的求值有三个影响的因素
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个,取决于他们的优先级。
如果两者的优先级相同,取决于他们的结合性。
2、操作符的优先级问题
操作符优先级一直是大家最难记忆的内容,笔者给大家分享一下本人的记忆口诀
括号成员第一;全体单目第二;乘除余三;加减四; 移位五;关系六;等于和不等于排第七;按位与、按位异或、按位或是8、9、10,逻辑与和逻辑或是十一与十二,条件高于赋值,逗号运算符级别最低。
今天的分享就到这啦😉
如果我的文章对您有帮助,
请 “点赞” “收藏” “关注”
一键三连哦!
想了解更多知识请前往故里♡927的博客
如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。
我们下期见😉~~