操作符(运算符)详解

这篇具有很好参考价值的文章主要介绍了操作符(运算符)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰算数操作符:+    -    *    /    %

🐰移位操作符:<<    >>

🌸进制的定义 

🌸整数二进制表示形式

🌸<< 左移操作符

🌸>>右移操作符

🐰位操作符:&   |   ^   

🌸&(按位与)|(按位或) 

 🌸^(按位异或)

🐰赋值操作符:    =

🐰复合赋值符:+=    -=    *=    /=    %=    <<=    >>=    &=    !=    ^=

🐰单目操作符:!    -    +    &    *    ~    --    ++

🐰关系操作符:>    >=    <    <=    !=    ==

🐰逻辑操作符:&&      ||

🐰条件操作符:exp1?exp2:exp3(三目操作符)

🐰逗号表达式:exp1,exp2,exp3,…,expN

🐰下标引用操作符 [ ]

🐰函数调用操作符 ( )

🐰结构成员访问操作符

🐰运算符的优先级顺序表

🐰隐式类型的转换-整形提升


🐰算数操作符:+    -    *    /    %

/:除法——得到的是商。
除法操作符的两个的操作数都是整数的话,执行的是整数除法。
除法操作符的两个的操作数 只要一个是浮点数 ,执行的是小数数除法。
例如:
9/2        就是整数除法
9/2.0或者9.0/2.0        就是小数除法
%:取模(取余)——得到的是余数
‼️注:取模操作符的两个个操作数必须为整数

🐰移位操作符:<<    >>

移位操作符(移动的是二进制的位)<<:左移操作符    >>:右移操作符

🌸进制的定义 

10进制的数据中:都是0~9的数字组成
2进制的数据:0~1的数字组成
8进制的数据:0~7的数字组成
16进制的每一位:0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f
(2进制,8进制,10进制,16进制只不过是数值的表达形式而已)
例如:数值10
1010    2进制
12        8进制
10        10进制
a           16进制

🌸整数二进制表示形式

整数的二进制表示形式有三种: 原码、反码、补码 ,正数的原、反、补码是相同的,只有负数的原、反、补码需要转换。
转换规则
原码:把一个数按照正负直接翻译成二进制就是原码
反码:原码的符号位不变,其他位按位取反
补码:反码+1
‼️ 注:原、反、补码的最高位是符号位
例如:5 -5是整数,一个整形变量是4字节32比特位
5
原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101
-5
原码:10000000000000000000000000000101
反码:11111111111111111111111111111010
补码:11111111111111111111111111111011

‼️注:整数在内存中存储的是补码

🌸<< 左移操作符

<<左移操作符: 左边抛弃,右边补0
例如:
int a=3;
int b=a<<1;
a:00000000000000000000000000000011(补码)
a<<1:00000000000000000000000000000110
b:00000000000000000000000000000110
int a=-3
int b=a<<1;
a:
原码:10000000000000000000000000000011
反码:111111111111111111111111111111111111111100
补码:111111111111111111111111111111111111111101
原码到补码:取反,+1(符号位不变)
补码到原码:-1,取反(符号位不变)和取反,+1(符号位不变)
a:111111111111111111111111111111111111111101
a<<1:111111111111111111111111111111111111111010
b:111111111111111111111111111111111111111010

🌸>>右移操作符

1:>>算术右移(左边用原来的符号位填充,右边丢弃
2:   >>逻辑右移(左边直接用0填充,右边丢弃
右移的时候,到底采用的是算术右移?还是逻辑右移,是取决于编译器的(常见的是算术右移
‼️注:对于移位操作符,不要移动负数位,这个是标准未定义的
例:
Int a=10;
a<<-1(错误)

🐰位操作符:&   |   ^   

位操作符:&(按位与)    |(按位或)   ^(按位异或)   

‼️注:位是二进制位,操作数必须是整数

🌸&(按位与)|(按位或) 

&:相同为相同的数,相异为0

int a=3 b=-5 ;
a:00000000000000000000000000000011    3的补码
b:10000000000000000000000000000101    
  11111111111111111111111111111010 
  11111111111111111111111111111011    -5的补码
a&b:00000000000000000000000000000011 
|: 相同为相同的数,相异为1
a|b:11111111111111111111111111111011 
a^b:11111111111111111111111111111000

 🌸^(按位异或)

异或:相同为0,相异为1
规则 (异或支持交换律的)
a^a=0
0^a=a
a^a^b=b
a^b^a=b
例题
交换a和b的值,不能用第三个变量
#include<stdio.h>
int main()
{
    int a=3;
    int b=5;
    a=a^b;//000000000011^000000000101=000000000110(6)
    b=a^b;//000000000110^000000000101=00000000011(3)
    //b=a^b^b=a
    a=a^b;//000000000110^00000000011=00000000101(5)
    //a=a^b^a
    return 0;
}

🐰赋值操作符:    =

a=b=c+1;//连续赋值(可读性较低)

🐰复合赋值符:+=    -=    *=    /=    %=    <<=    >>=    &=    !=    ^=

🐰单目操作符:!    -    +    &    *    ~    --    ++

~:按位取反(二进制)
例:
int a=0
a:00000000000000000000000000000000
~a:11111111111111111111111111111111 补码
   11111111111111111111111111111110 反码
   10000000000000000000000000000001 原码
~a=-1
‼️注:While(~scanf(“%d”,&a)),scanf读取失败会返回EOF,就是-1,-1按位取反则是0

--:前置:先使用,再--,后置:先使用,再--

++:前置:先使用,再++,后置:先使用,再++

int a=10,b=0;
    //b=a++;//后置++:先使用,再++,先把a=10值赋给b,然后a再++,a=11,b=10;
    //b=++a;//前置++:先++,再使用,a先++,a=11,然后把a=11赋值给b,b=11;
    b=a--;
    b=--a;

🐰关系操作符:>    >=    <    <=    !=    ==

‼️注:=(赋值操作符)和==(关系操作符)

🐰逻辑操作符:&&      ||

逻辑操作符关注真假(1和0),&&(逻辑与)和||(逻辑或)

例:

int i=0,a=0,b=2,c=3,d=4;
   i=a++&&++b&&d++;//如果左边为假,后面就不需要算了
   printf("a=%d b=%d c=%d d=%d i=%d\n",a,b,c,d,i);
结果为:a=1 b=2 c=3 d=4 i=0,因为a++,是后置++,所以此时a值为0,则后后面的不需要计算,就为初始值
   i=a++||++b||d++;//如果左边为真,后面就不需要算了
   printf("a=%d b=%d c=%d d=%d i=%d\n",a,b,c,d,i);
结果为:a=1 b=3 c=3 d=4 i=0,因为++b前置++,此时b值不为0,所以后面的d不会进行计算。

🐰条件操作符:exp1?exp2:exp3(三目操作符)

int a=5,b=3,c=0;

c=a>b?a:b

🐰逗号表达式:exp1,exp2,exp3,…,expN

例如两数中求最大值
#include<stdio.h>
int main()
{
    int a=3,b=5;
    int max=a>b?a:b
    return 0;
}

🐰下标引用操作符 [ ]

数组里常用,arr[ ],arr[ i ]...

🐰函数调用操作符 ( )

Int len=strlen(“abc”);

Int Add(3,5)//3,5就是( )的操作数

🐰结构成员访问操作符

(1).    结构体变量.结构体成员名

(2)->    结构体指针->结构体成员

struct  S

{

    int num;

    char c;

};

void test(struct S* ps )

{

    printf(“%d”,(*ps).num);

    printf(“%c”,(*ps).c)

    printf(“%d”,ps->num);//只有结构体指针才能使用->

    printf(“%c”,ps->.c)

}

int main()

{

struct S s={100,’b’};

printf(“%d\n”,s.num);

printf(“%c\n”,s.c);

test(&s)

return 0;

}

🐰运算符的优先级顺序表

优先级
操作符(运算符)
名称
使用原型
结合规律
注释
  • 1
[ ]
数组下标
数组名[常量表达式]
从左到右
( )
小括号
(表达式)/(强制转换类型)
.
成员选择(对象)
对象.成员名
->
成员选择(指针)
指针->成员名
  • 2
!
逻辑反操作符(逻辑非)
!表达式
从右到左
单目运算符
-
负值
-表达式
+
正值
+表达式
&
取地址运算符
&变量名
*
间接访问操作符(解引用操作符)
*指针变量
~
按位取反操作符
~表达式
--
自减运算符
--变量名/变量名--
++
自加运算符
++变量名/变量名++
sizeof
长度运算符
sizeof(表达式)
(类型)
强制类型转换
(数据类型)表达式
  • 3
/
表达式/表达式
从左到右
双目运算符
*
表达式*表达式
%
取模(取余)
整形表达式%整形表达式
  • 4
+
表达式+表达式
-
表达式-表达式
  • 5
<<
左移
变量<<表达式
>>
右移
变量>>表达式
  • 6
>
大于
表达式>表达式
从左到右
双目运算符
>=
大于等于
表达式>=表达式
<
小于
表达式<表达式
<=
小于等于
表达式<=表达式
  • 7
==
等于
表达式==表达式
!=
不等于
表达式!=表达式
  • 8
&
按位与
表达式&表达式
从左到右
双目运算符
  • 9
^
按位异或
表达式^表达式
  • 10
|
按位或
表达式|表达式
  • 11
&&
逻辑与
表达式&&表达式
  • 12
||
逻辑或
表达式||表达式
  • 13
?:
条件运算符
表达式1?表达式2:表达式3
从右到左
三目运算符
  • 14
=
赋值运算符
变量=表达式
从右到左
/=
除后赋值
变量/=表达式
*=
乘后赋值
变量*=表达式
%=
取模后赋值
变量%=表达式
+=
加后赋值
变量+=表达式
-=
减后赋值
变量-=表达式
<<=
左移后赋值
变量<<=表达式
>>=
右移后赋值
变量>>=表达式
&=
按位与后赋值
变量&=表达式
^=
按位异或后赋值
变量^=表达式
|=
按位或后赋值
变量!+表达式
  • 15
,
逗号运算符
表达式,表达式...
从左到右

‼️注:同一优先级的运算符,顺序由结合规律所决定

🐰隐式类型的转换-整形提升

整形提升是按照变量的数据类型的符号来提升的

(1)负数的整形提升

char c1=-1;

变量c1的二进制位(补码)中只有8个bit位;

11111111

因为char为有符号的char

所以整形提升的时候,高位补充符号位,即为1

提升之后的结果是:

111111111111111111111111111111111

(2)正数的整形提升

char c2=1;

变量是c2的二进制(补码)中只有8个bit位;

00000001

因为char为有符号的char

所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是:

00000000000000000000000000000001

(3)无符号整型提升,高位补0

例题:
 

int main()
{
    char a=3;
    //00000000000000000000000000000011-都是补码
    //000000111-截断

    char b=127;
    //00000000000000000000000001111111
    //01111111-截断

    char c=a+b;
    //00000000000000000000000000000011
    //00000000000000000000000001111111
    //00000000000000000000000010000010
    //运算时整形提升
    //10000010
    //赋值给c时又发生截断
    printf("%d\n",c);
    //10000010
    //11111111111111111111111110000010-补码
    //11111111111111111111111110000001-反码
    //10000000000000000000000001111110-原码
    //所以打印出的值为10000000000000000000000001111110(二进制),-126(十进制)
    //%d打印整型提升
    return 0;
}

​​​​​​​

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  文章来源地址https://www.toymoban.com/news/detail-803301.html

到了这里,关于操作符(运算符)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++类与对象(二)——赋值运算符重载与取地址操作符重载

    前言: 本章将通过 日期类 的实现,深入学习 运算符重载 的实现方法。本章将完成6个默认成员函数中剩余3个—— 赋值运算符重载 与 取地址操作符重载 的学习。 C++ 为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有 特殊函数名 的函数,也具有其返回值类型,

    2024年02月03日
    浏览(44)
  • C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)

    C++ operator的使用(重载运算符、仿函数、类型转换操作符) C++11实用技术(一)auto与decltype的使用 C++11实用技术(二)std::function和bind绑定器 C++11实用技术(三)std::future、std::promise、std::packaged_task、async C++11 中,operator 是一个,用于重载运算符。通过重载运算符

    2024年02月14日
    浏览(45)
  • [C++] 类与对象(中)类中六个默认成员函数(2)-- 运算符重载 -- 取地址及const取地址操作符重载

      本篇我们以日期类来展开讲。对于一个日期,我们如何去比大小呢?对年月日依次进行比较可以,但是可以直接比较吗? 我们可以看到,对于自定义类型的日期类直接去比较两个日期的大小是错误的,因此我们需要对运算符赋予特殊的功能,去实现可以对自定义类型的比较

    2024年02月13日
    浏览(50)
  • 位运算符及其相关操作详解

    前言:由于位运算符是直接对二进制数操作,因此对二进制、八进制、十六进制不甚了解的小伙伴建议先看这篇二进制、八进制、十六进制与十进制的相互关系,这样阅读本篇时将事半功倍 位运算是对 计算机存储的二进制序列的相应位进行操作 位运算的 操作数必须是整数型

    2024年02月05日
    浏览(39)
  • VHDL的运算操作符

    在VHDL语言中共有4类操作符,可以分别进行 逻辑运算(logical)、关系运算(relational)、算术运算(Arithmetic)和并置运算(Concatenation) 。需要注意的是,被操作符所操作的对象是操作数,且操作数的类型应该和操作符所要求的类型相一致。另外,运算操作符是有优先级的,

    2024年02月06日
    浏览(36)
  • Go运算操作符全解与实战:编写更高效的代码!

    本文全面探讨了Go语言中的各类运算操作符,从基础的数学和位运算到逻辑和特殊运算符。文章旨在深入解析每一种运算操作符的工作原理、应用场景和注意事项,以帮助开发者编写更高效、健壮和可读的Go代码。 Go语言,作为一种现代的编程语言,不仅因为其简单易读的语法

    2024年02月09日
    浏览(36)
  • C++ 赋值运算重载,const成员,取地址及const取地址操作符重载

    所属专栏:C“嘎嘎\\\" 系统学习❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 🚀 关注我,关注我,关注我,重要的事情说三遍!!!!!

    2024年02月06日
    浏览(49)
  • Python教程(13)——Python运算符详解|算术运算符|比较运算符|逻辑运算符|位运算符

    Python的运算符是用于执行各种操作的符号或符号组合。它们用于操作数据并进行算术、比较、逻辑和其他类型的运算。我们所熟知的加减乘除也是运算符中的一种。Python提供了多种类型的运算符,有算术运算符,比较运算符,赋值运算符,逻辑运算符,位算符等等。 算术运算

    2024年02月09日
    浏览(52)
  • 【C++】详解运算符重载,赋值运算符重载,++运算符重载

    目录 前言 运算符重载 概念 目的 写法 调用 注意事项 详解注意事项 运算符重载成全局性的弊端 类中隐含的this指针 赋值运算符重载 赋值运算符重载格式 注意点 明晰赋值运算符重载函数的调用 连续赋值 传引用与传值返回 默认赋值运算符重载 前置++和后置++重载 先梳理一下

    2024年04月25日
    浏览(75)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包