操作符详解

简介: 操作符详解

今天开始来介绍各种操作符

1.操作符分类

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

2.算术操作符

+     -   *   /   %

注意点:

  • “/” 操作符如果两个操作数都为整数,执行整数除法
  • “/” 操作符只要有浮点数执行的就是浮点数除法
  • % 操作符的两个操作数必须为整数,返回的是整除之后的余数。
  • 还有(5/0)这种形式是错误的vs里会出现C2124的错误(被零除或对零求模。常量表达式的分母为零。 若要解决此错误,请勿将零作为除数。

3.移位操作符

<< 左移操作符

>> 右移操作符

注:移位操作符的操作数只能是整数。

在讲解移位运算符之前,先大概的讲解一下原码、反码、补码的必备知识点

  • 正数的原码、反码、补码都是一样的
  • 最前面的1/0是符号位,1(负数)和0(正数)

该怎么计算呢?

接下来开始正式讲解移位操作符

1左移操作符

  1. 先将数转换成二进制,然后向左移n位(左移后右边就缺少了,所以在右边加0,补上空缺)
  2. 左移无论是正数和负数都遵循一个公式

 2右移操作符  

1.先将数转换成二进制,然后向右移n位

右移:

算术右移(右边丢弃,左边补原来的符号位)

逻辑右移 (右边丢弃,左边直接补0)

C语言没有明确规定倒是算术右移还是逻辑右移,一般编译器上采用的是算术右移

警告:对于移位运算符,不要移动负数位,这个标准还未定义的;

4.位操作符

&---------- 按位与

| ---------- 按位或

^ ---------- 按位异或(支持交换律)

注:他们的操作数必须是整数。

a^a=0

0^a=a

//这种代码可读性不高,效率也不高
 a = a^b;
 b = a^b;
 a = a^b;
 
 
//代码可读性高,效率也高
temp=a;
a=b;
b=temp;

5.赋值操作符

a = x = y + 1 ; // 连续赋值

这种代码的可读性不高

复合赋值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

6.单目操作符

!                逻辑反操作

-                负值

+               正值

&               取地址

sizeof        操作数的类型长度(以字节为单位)

~               对一个数的二进制按位取反

--               前置、后置 --

++             前置、后置 ++

*                间接访问操作符 ( 解引用操作符 )

( 类型 )       强制类型转换

一个重要的点:

sizeof是操作符不是函数

printf ( "%d\n" , sizeof     arr   );// arr的括号可以去掉,这就可以说明sizeof不是函数

printf ( "%d\n" , sizeof ( int ));    //但是sizeof如果要计算的是类型的大小,那这个括号就不能去掉,否则就会报错

++和--运算符

  • 前置++和--
//前置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = ++a;//先++,然后再用a=11,x=11;
    int y = --a;//先--,然后再用a=10,y=10;
     return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = a++;//先用a,再增加,x=10;之后a变成11;
    
    int y = a--;//先用a,再自减,y=11;之后a变成10;
    
    return 0;
}

7.关系操作符

>

>=

<

<=

!=        用于测试 “ 不相等 ”

==       用于测试 “ 相等 ”

警告:

在编程的过程中 == 和 = 不小心写错,会导致的错误的欧

8.逻辑操作符

&&        逻辑与

||           逻辑或

9.条件操作符 (三目操作符)

exp1 ? exp2 : exp3

例子:a=1;b=3;

a>b?a:b;(答案是3)

10.逗号表达式

  • 逗号表达式,就是用逗号隔开的多个表达式。
  • 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

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

1. [ ] 下标引用操作符

操作数:一个数组名 + 一个索引值

2. ( ) 函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

3. 访问一个结构的成员

. 结构体 . 成员名

-> 结构体指针 -> 成员名

12.表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。

同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

算术转换

  • 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
  • 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

操作符的属性

两个相邻的操作符先执行顺序取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

优先级高的先算,低的后算

还有一点要重点看:

int main()
{
 int i = 10;
 i = i-- - --i * ( i = -3 ) * i++ + ++i;
 printf("i = %d\n", i);
 return 0;
}

这种代码就是垃圾代码,无法确定唯一的计算路径

                                   在不同编译器中测试结果:非法表达式程序的结果 

编译器
128

Tandy 6000 Xenix 3.2

—95

Think C 5.02(Macintosh)

—86

IBM PowerPC AIX 3.2.5

—85

Sun Sparc cc(K&C编译器)

—63

gccHP_UX 9.0Power C 2.0.0

4

Sun Sparc acc(K&C编译器)

21

Turbo C/C++ 4.5

22

FreeBSD 2.1 R

30

Dec Alpha OSF1 2.0

36

Dec VAX/VMS

42

Microsoft C 5.1

总结:如果表达式不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题

的。

❤️结语:


本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!


目录
打赏
0
2
2
0
16
分享
相关文章
拷贝构造函数与移动构造函数
拷贝构造函数与移动构造函数
122 0
Nacos 服务端健康检查及客户端服务订阅机制源码分析(三)(下)
Nacos 服务端健康检查及客户端服务订阅机制源码分析(三)(下)
204 0
利用低代码,实现软件开发民主化
低代码的出现证明了曾经被软件开发人员垄断的开发技术,现在已经掌握在业余爱好者的手中,他们可以尝试和利用软件来发来实现业务增长。
124 0
LeetCode每日一题——933. 最近的请求次数
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
108 0
如何购买阿里云服务器ECS更便宜实惠?
为了让新手了解去服务器,本期我们主要介绍如何购买阿里云ECS服务器,希望能通过我的经验,能帮助到大家!
ASP.NET Core: 二十. Action的多种数据返回格式处理机制(三)
上一章讲了系统如何将客户端提交的请求数据格式化处理成我们想要的格式并绑定到对应的参数,本章讲一下它的“逆过程”,如何将请求结果按照客户端想要的格式返回去。
336 0
ASP.NET Core: 二十. Action的多种数据返回格式处理机制(三)
实时计算案例:杭州企鹅科技
公司依托领先的物联网技术,瞄准线下消费升级和差异化趋势,利用智慧物联技术连接并赋能线下商用设备实现商户的智能化管理,降低运维成本、提高收益;同时,为用户提供基于LBS定位的物联自助智能体验服务,满足用户体验的智能化,个性化需求。
实时计算案例:杭州企鹅科技
测试工程师不懂AI,还有未来吗?
阿里妹导读:近几年人工智能、机器学习等词漫天遍地,似乎有一种无AI,无研发,无AI,无测试的感觉。有人说:不带上“智能”二字,都不好意思说自己是创新。我们先暂且不评论对错,只探讨这背后值得我们思考的问题。
2193 0
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等