首页 > 其他分享 >操作符介绍

操作符介绍

时间:2023-01-27 16:31:42浏览次数:48  
标签:操作数 int 介绍 操作符 整型 printf 按位

算数操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号操作符

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

算数操作符

+ - * / %

1./如果一边或两边有浮点数则结果是浮点数,否则为整数结果 

2.%只能用于整数之间的运算,返回的是整除后的余数

移位操作符

左移操作符;右移操作符

操作的数必须是整数;移位 移的是二进制位。

左移:左边丢弃 右边补0

右移:分为算术移位;逻辑移位

1.算术移位:右边丢弃 左边补原符号位(0正1负)

-1
原码10000000000000000000000000000001
反码11111111111111111111111111111110
补码11111111111111111111111111111111
>>1:11111111111111111111111111111111

所以-1>>1=-1

16>>1,
16:00000000000000000000000000010000
8 :00000000000000000000000000001000

所以16>>1-8

2.逻辑移位:右边丢弃 左边补0

技巧:正数左移*2、右移/2

注:位移操作符不能移动负数位

位操作符

操作的数必须是整数;操作的是二进制位。

&按位与

|按位或

^按位异或

如果是负数就用补码进行运算

例:

按位与&:全1则1(更深入例子:​​编写代码实现:求一个整数存储在内存中的二进制中1的个数​​)

#include<stdio.h>
int main()
{
int a=3;//011
int b=5;//101
int c=a&b;//001
printf("%d\n",c);
return 0;
}

操作符介绍_整型

按位与|:有1则1

#include<stdio.h>
int main()
{
int a=3;//011
int b=5;//101
int c=a|b;//111
printf("%d\n",c);
return 0;
}

操作符介绍_操作数_02

按位异或^:同0异1(更深入的例子:​​笔试:交换两个int的值,且不使用第三个变量的引入​​)

#include<stdio.h>
int main()
{
int a=3;//011
int b=5;//101
int c=a^b;//110
printf("%d\n",c);
return 0;
}

操作符介绍_操作数_03

赋值操作符

=

注:赋值操作符可以连续使用

int a=10;
int x=0;
int y=20;
a=x=y+1;//a=x=21

复合赋值符

+=

-=

*=

/=

%=

<<=

>>=

&=

|=

^=

单目操作符

只作用一个操作数

(a+b 这个“+”号将a和b联系起来了 所以是双目操作符;!a 这个“!”仅对a进行了操作 所以是单目操作符)

! 逻辑反操作

- 负值

+ 正值

& 取地址

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

~ 对一个数的二进制按位取反  注:按位取反对于负号的符号位也要取反

-- 前置、后置--

++ 前置、后置++

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

(类型) 强制类型转换

关系操作符

>

>=

<

<=

!=  用于测试“不相等”

==  用于测试“相等”

注:=是赋值 ==是相等

逻辑操作符

&&  逻辑与

||  逻辑或

逻辑与:左边若为假 右边就不计算了

#include<stdio.h>
int main()
{
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++;
printf("%d\n%d\n%d\n%d\n",a,b,c,d);
return 0;
}

操作符介绍_整型_04

逻辑或:左边若为真 右边就不计算了

#include<stdio.h>
int main()
{
int i=0,a=1,b=2,c=3,d=4;
i=a++||++b||d++;
printf("%d\n%d\n%d\n%d\n",a,b,c,d);
return 0;
}

操作符介绍_操作符_05

区别按位与和按位或:位:二进制位

条件操作符

exp1?exp2:exp3

if(a>5)
b=3;
else
b=-3;

相当于

b=(a>5?3:-3)

例子:求最大值

max=(a>b?a:b)

逗号表达式

exp1,exp2,exp3,...expN

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

int a=1;
int b=2;
int c=(a>b,a=b+10,a,b=a+1);//c是多少?

依次执行a=b+10=12,c=b=a+1=13


if(a=b+1,c=a/2,d>0)

最关键的是d>0作为判断条件


a=get_val();
count_val(a);
while(a>0)
{
a=get_val();
count_val(a);
}

相当于

while(a=a=get_val(),count_val(a),a>0)
{

}

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

1.[ ]下标引用操作符

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

int arr[10];//创造数组
arr[9]=10;//实际下标引用操作符

[ ]的两个操作数是arr和9

2.( )函数调用操作符

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

int max=get_max(a,b)//三个操作数get_max,a,b

3.访问一个结构的成员

.    结构体.成员名

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

#include<stdio.h>
struct Stu//创建结构体类型
{
char name[20];
int age;
char id[20];
};

int main()
{
//使用struct Stu 创建了一个对象叫s1 并初始化
struct Stu s1={"张三",20,"01"};
struct Stu* ps=&s1;

printf("%s\n",s1.name);
printf("%d\n",s1.age);
printf("%s\n",s1.id);

printf("%s\n",(*ps).name);

printf("%s\n",ps->name);
return 0;
}

表达式求值

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

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

隐式类型转换

整型提升

c的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得整个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义:表达式的整型运算要做cpu的相应运算器件内执行,cpu内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是cpu的通用寄存器的长度。因此,即使两个char类型的相加,在cpu执行时实际上也要先转换为cpu内整型操作数的标准长度。通用cpu(general-purposeCPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsignedint,然后才能送入CPU去执行运算。

char a,b,c;
...
a=b+c;

这里的b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成后,结果将被截断,然后再储存于a中。

如何进行整型提升:按照变量的数据类型的符号位提升(有符号 正补0负补1,无符号直接补0)

算术转换

如果某个操作符的各个操作数属于不同的类型 那么除非其中一个操作数的转换为另一个操作数的类型,否则操作数就无法进行。

寻常算术转换:

long double 

double

float

unsiged long int

long int

unsiged int

int

如果某个操作数类型在上面这个列表排名较低,那么首先要转换为另外一个操作数的类型后执行运算(小的转换为大的)

操作符的属性

1.操作符的优先级

2.操作符的结合性

3.是否控制求值顺序

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




标签:操作数,int,介绍,操作符,整型,printf,按位
From: https://blog.51cto.com/u_15899086/6024120

相关文章

  • 3D数字孪生场景编辑器介绍
    1、背景数字孪生的建设流程涉及建模、美术、程序、仿真等多种人才的协同作业,人力要求高,实施成本高,建设周期长。如何让小型团队甚至一个人就可以完成数字孪生的开发,是数字......
  • 【Javaweb】Servlet九 | base标签的作用【详细介绍】
    base标签的作用导言:路径跳转<ahref="/a/b/c.html">这是a下的b下的c</a></br><ahref="/ForwardC">请求转发:这是a下的b下的c</a></br><ahref="../../index.jsp">跳......
  • OSI七层模型介绍
      ......
  • cuda 编程(3)基本介绍
    Chapter3BasicframeworkofsimpleCUDAprograms3.1Anexample:addinguptwoarraysWeconsiderasimpletask:addinguptwoarraysofthesamelength(samenu......
  • kylin详细介绍
    OLAP(on-LineAnalysisProcessing)的实现方式ROLAP:基于​​关系数据库​​的OLAP实现(RelationalOLAP)。ROLAP将多维数据库的多维结构划分为两类表:一类是事实表,用来存储数......
  • Hadoop MapReduce介绍、官方示例及执行流程Apache Hadoop概述
    Hadoop离线是大数据生态圈的核心与基石,是整个大数据开发的入门。本次分享内容让初学者能高效、快捷掌握Hadoop必备知识,大大缩短Hadoop离线阶段学习时间,下面一起开始今天的学......
  • 介绍一款 ABAP 代码搜索工具 RS_ABAP_SOURCE_SCAN 的使用方法
    @目录ABAP代码搜索工具:ABAP报表RS_ABAP_SOURCE_SCAN实际工作中的一个需求:找到SAPCRM产品主数据搜索实现里使用了OPENCURSOR关键字的准确位置笔者曾经写过一篇文......
  • Mongo-Shake介绍(1)
    Mongo-Shake由阿里云Nosql团队开发和维护,是一个基于MongoDB的oplog的通用服务平台。从源mongo数据库中获取oplog,并在目标mongo数据库中重放或通过不同的tunnels发送到其他......
  • @RequestParam中required的介绍
    required=true是在前端没有传参数的时候报错,并不能防止参数为空。required=false表示前端不传参数的时候,会将参数置为null。因此假如参数是int这种不能赋值为null的类......
  • (18)go-micro微服务ELK介绍
    目录一什么是ELK二Beats的六种工具三ELK系统的特点四ELK+beats系统架构五ELK优点六最后一什么是ELKELK是三个[开源软件]的缩写,分别表示:Elasticsearch,Logstash,......