【C语言必经之路——第9节】操作符详解

目录

一、操作符分类

二、操作符详解

1、算术操作符

2、移位操作符

(1)、左移操作符

(2)、右移操作符

 3、位操作符

4、赋值操作符

 5、单目操作符

 6、关系操作符

 7、 逻辑操作符

 8、条件操作符

9、逗号表达式

10、 下标引用、函数调用和结构成员

三、表达式求值(操作符的使用)

1、复杂表达式的求值有三个影响的因素

2、操作符的优先级问题


一、操作符分类

  • 算术操作符(+   -   *   /   %
  • 移位操作符(<<  >>
  • 位操作符   (&   |   ^
  • 赋值操作符(=   +=   -=    *=    /=    %=    >>=    <<=    &=   |=   ^=
  • 单目操作符(!   -    +   &    sizeof   ~    --   ++   *   (类型)
  • 关系操作符(>  >=   <    <=   !=   == 
  • 逻辑操作符(&&  ||
  • 条件操作符(exp1 ? exp2 : exp3
  • 逗号表达式(exp1, exp2, exp3, …expN
  • 下标引用、函数调用和结构成员([ ]   ( )   .     ->

二、操作符详解

1、算术操作符

算数操作符包括五种:+   -   *   /   %

要注意的是:

  1. 除了 % 操作符之外,其他的几个操作符可作用于整数和浮点数,% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。

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的博客

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


我们下期见😉~~

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里♡9513

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值