当前位置:首页 » 《关注互联网》 » 正文

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

26 人参与  2022年01月21日 11:43  分类 : 《关注互联网》  评论

点击全文阅读


        今天小玄为大家带来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,一道变态的面试题:不能创建临时变量(第三个变量),实现两个数的交换。

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

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));  // 10
printf("%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. 是否控制求值顺序。

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

附表:

 


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

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

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/33658.html

操作  的是  赋值  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1