资讯专栏INFORMATION COLUMN

【C语言操作符多图详解】——“讲述你所未知的操作符细节”

iliyaku / 2693人阅读

摘要:今天小玄为大家带来语言的操作符相关的讲解,希望大家能通过这篇文章对相关操作符有更加深入的理解。操作符的两个操作数必须为整数。操作符的优先级操作符的结合性是否控制求值顺序。两个相邻的操作符先执行哪个取决于他们的优先级。

        今天小玄为大家带来C语言的操作符相关的讲解,希望大家能通过这篇文章对相关操作符有更加深入的理解。那么:

  


目录

 算数操作符

 移位操作符

1·<< 左移操作符

* * 左移操作前 * *

    * * 左移操作后 * * ​    ​

* * 总结 * *

 2. >> 右移操作符

位操作符 

* * & (按位与)* *

 * * | (按位或)* *

 * * ^ (异或)* *

 实践运用

赋值操作符

* * 举例 * *

 复合赋值符

 单目操作符

* * 类型 * *

* *sizeof * * (操作符)(不是函数!)

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

 例题实战

关系操作符 

* * 类型 * *

逻辑操作符 

* * 类型 * *

“区分逻辑与和按位与” “ 区分逻辑或和按位或 ”

一道笔试题

条件操作符 

exp1 ? exp2 : exp3

 逗号表达式

操作符的属性 



 算数操作符

                        +                   -                  *                  /                  %

         相关细节:

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

 移位操作符

<< 左移操作符

>> 右移操作符

1·<< 左移操作符

* * 左移操作前 * *

移位操作符,移动的是二进制位(适用于整数哦)

对于整数的二进制有3种表示形式 :原码,反码,补码

  1. 正整数 —— 原码,反码,补码相同
  2. 负数    ——  看实际情况       

原码 —— 直接按照数字的正负写出的二进制序列

反码 —— 原码的符号位不变,其他位按位取反得到的

补码 —— 反码+1

整数在内存中存储的是二进制的补码 

    * * 左移操作后 * *     

* * 总结 * *

左移操作符 移位规则:左边抛弃、右边补0 

 2. >> 右移操作符

右移操作分两种:

  1. 算术右移
  2. 逻辑右移

 

大部分的编译器使用的是算术右移 

 警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。 int num = 10;

int num = 10;num >> 1;//错误的操作

位操作符 

* * & (按位与)* *

按二进制位(即用该数的补码进行计算)

 


 * * | (按位或)* *


 * * ^ (异或)* *

规则 : 相同为 0;相异为1


 实践运用

1,求一个正整数原码中有几个1

int a = 15;int i = 0;int sum =0;for(i  = 0;i < 32;i++){    sum += a & 1;    a = a >> 1;}

2,一道{{BANNED}}的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

(常规解法(有溢出风险)) + (创建临时变量)

int main(){    int a = 3;    int b = 5;    a = a + b;     //防止过大,有上限,会导致溢出    b = a - b;    a = a - b;               return 0;}

      ***  (异或的解法)  ***

int a = 3;int b = 5;//异或a = a ^ b;b = a ^ b;a = a ^ b;

a ^ a = 0

0 ^ a = a

a ^ b ^ a = b

a ^ a ^ b = b  (异或支持交换律


赋值操作符

* * 举例 * *

int weight = 120;//体重

weight = 89;

//不满意就赋值double salary = 10000.0;salary = 20000.0;

//使用赋值操作符赋值。赋值操作符可以连续使用,比如:

int a = 10;

int x = 0;

int y = 20;

a = x = y+1;//连续赋值这样的代码感觉怎么样?

那同样的语义,你看看:

x = y+1;

a = x;

这样的写法是不是更加清晰爽朗而且易于调试。

 复合赋值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=


 单目操作符

* * 类型 * *

!             逻辑反操作

-             负值

+            正值

&            取地址

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

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

--            前置、后置--

++          前置、后置++

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

(类型)     强制类型转换


* *sizeof * * (操作符)(不是函数!)

sizeof是计算变量或者类型创建变量的内存大小,和内存中存放什么数据没有关系 

char arr[0] = "abc";printf("%d",sizeof(arr));  // 10printf("%d",strlen(arr));  // 3

如代码所示,strlen()输出的是字符串的长度,关注的是内存中是否有"/0",计算的是"/0"前出现的字符个数


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


 例题实战

 数组名放在sizeof的内部,数组名表示的整个数组的大小

 数组传参时,数组名表示的是数组首元素的地址


关系操作符 

* * 类型 * *

>

>=

<

<=

!=  用于测试“不相等”

==     用于测试“相等”


逻辑操作符 

* * 类型 * *

&&      逻辑与

||         逻辑或


“区分逻辑与和按位与” “ 区分逻辑或和按位或 ”

1&2----->0

1&&2---->1

1|2----->3

1||2---->1


一道笔试题

 “1 2 3 4”(思考一下哦


条件操作符 

exp1 ? exp2 : exp3


 逗号表达式

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

 exp1, exp2, exp3, …expN


操作符的属性 

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

1. 操作符的优先级2. 操作符的结合性3. 是否控制求值顺序。

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

附表:

 


以上就是这篇文章的全部内容啦!

希望你能对操作符有一个更深入的了解。

如果觉得有帮助的话,请给小玄: 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121285.html

相关文章

  • laravel中使用WangEditor及多图上传

    摘要:多图上传修改里面的方法将封面修改为封面创建图片修改器修改器使用说明,请阅读相关说明文档在里增加和两个方法显示效果原文地址地址 laravel中使用WangEditor及多图上传 1. 创建项目及安装所需安装包 1.1 创建项目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 创建...

    FingerLiu 评论0 收藏0
  • laravel中使用WangEditor及多图上传

    摘要:多图上传修改里面的方法将封面修改为封面创建图片修改器修改器使用说明,请阅读相关说明文档在里增加和两个方法显示效果原文地址地址 laravel中使用WangEditor及多图上传 1. 创建项目及安装所需安装包 1.1 创建项目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 创建...

    qianfeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<