我能“C”——详解操作符(下)

目录

1.条件操作符

 2.逗号表达式

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

4.表达式求值(学表达式的最终目标)

4.1 隐式类型转换

4.2算术转化

4.3操作符的属性

THE END


1.条件操作符

exp1 ? exp2 : exp3

举例:

 另一种写法:

 2.逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。

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

 

//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?

代码1:从左到右依次计算,首先a>b为假所以为0;a=b+10得到a值为12;a的值为12;b=a+1得到b的值为13;最后b赋值给c;所以c为13

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

1.[ ]下标引用操作符

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

int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
 [ ]的两个操作数是arr和9。

2.( )函数调用操作符

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

#include <stdio.h>
 void test1()
 {
 printf("hehe\n");
 }
 void test2(const char *str)
 {
 printf("%s\n", str);
 }
 int main()
 {
 test1();            //实用()作为函数调用操作符。
 test2("hello\n");//实用()作为函数调用操作符。
 return 0;
 }

int c = Add(3,5);//Add,3,5都是()的操作数

4.表达式求值(学表达式的最终目标)

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

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

4.1 隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升.

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。

//实例1
char a,b,c;
...
a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算。

加法运算完成之后,结果将被截断,然后再存储于a中。

如何进行整形提升呢? 

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

//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0

 整形提升的例子

//实例1
int main()
{
 char a = 0xb6;
 short b = 0xb600;
 int c = 0xb6000000;
 if(a==0xb6)
 printf("a");
 if(b==0xb600)
 printf("b");
 if(c==0xb6000000)
 printf("c");
 return 0;
}

实例1中的a,b要进行整形提升,但是c不需要整形提升 a,b整形提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表 达式 c==0xb6000000 的结果是真.

程序结果为C

//实例2
int main()
{
 char c = 1;
 printf("%u\n", sizeof(c));
 printf("%u\n", sizeof(+c));
 printf("%u\n", sizeof(-c));
 return 0;
}

实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字 节. 表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节。

4.2算术转化

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int

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

警告: 但是算术转换要合理,要不然会有一些潜在的问题。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

4.3操作符的属性

复杂表达式的求值有三个影响的因素: 1. 操作符的优先级 2. 操作符的结合性 3. 是否控制求值顺序。 两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。 操作符优先级。

 

 

THE END

        这是今日份关于操作符的一些分享,希望可以帮助到大家!如果有什么不足的地方也请家人们给小叶一些好的建议,我会不断优化文章的!那就让我们一起加油吧!哈哈哈哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/5937.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg 入门学习 07--创建音视频解码管理类

前言 使用 FFmpeg 进行音视频解码&#xff0c;其实是一套标准操作&#xff0c;按照固定的流程进行实现即可。使用 FFmpeg 进行音视频解码的基本流程、及用到的关键 API 接口和 结构体&#xff0c;如下图所示&#xff1a; 背景 FFmpeg 解码所需资源 使用 FFmpeg 对视频流解…

图片怎么转PDF文件?三种免费转换方法集合!

在办公室、学习和生活中&#xff0c;我们经常需要看到大量的图片文件&#xff0c;但毕竟&#xff0c;一张一张地看照片相对麻烦&#xff0c;所以我们通常会把照片变成PDF。事实上&#xff0c;图片到PDF的操作过程非常简单。今天&#xff0c;我将教你如何批量将图片转换为PDF格式…

linux宝塔面板安装composer的方法[全网详解]

概念&#xff1a; Composer是一个PHP依赖管理器&#xff0c;可以方便地管理和安装PHP项目所依赖的库和软件包。它可以自动下载、安装和更新这些库&#xff0c;同时确保它们与项目的其他部分兼容。Composer可以通过一个名为composer.json的配置文件来配置&#xff0c;该文件列出…

@Transactional和synchronized同时使用时的一些问题以及解决

Transactional和synchronized同时使用并不能保证事务一致性背景任何事情都有一个发生背景有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】我的思路就是用Transactional 和 synchronized来保证事务…

YOLO算法改进指南【算法解读篇】:2.如何训练自己的数据集

我们接着上一篇文章配置完YOLOv5需要的环境后,今天我们试着用YOLOv5训练自己的数据。(在开始本教程前,记得先跑一遍入门篇,确保环境是正常的) 有图有真相,先看看我的运行结果 【YOLOv5 源码地址】 🚀 我的环境: 语言环境:Python3.8编译器:PyCharm深度学习环境: to…

13、操作系统——posix信号量(无名信号量)

目录 一、无名信号量的介绍 二、信号量的使用步骤 三、sem_init、sem_destroy 四、system-V 信号量和 POSIX 信号量&#xff08;named-sem 和 unnamed-sem&#xff09;的区别 五、代码 一、无名信号量的介绍 因为有名信号量的线程共享一个内存空间&#xff0c;若要解决进…

python开启局域网传输

python开启局域网传输 1.找自己的IP 在命令提示窗口输入&#xff1a;ipconfig <----找自己的IP地址 2.创建要传输文件的文件夹&#xff08;只允许在该文件夹下访问传输&#xff09; a.复制文件夹路径 b.在命令提示窗口cd打开新创建的文件夹 cd “C:\Users\86151\Desktop…

【C++笔试强训】第五天

选择题 解析&#xff1a;本题考查do while循环及后置。刚开始x 1&#xff0c;先进入循环中&#xff0c;后置是先使用再&#xff0c;所以printf输出结果为 1。后x的值变为2&#xff0c;经while(x–)后又变为1&#xff0c;再次进入循环…… 所以该程序将会陷入死循环。 解析&…

PerfEnforce Demonstration: Data Analytics with Performance Guarantees

PerfEnforce Demonstration: Data Analytics with Performance Guarantees Created by: ctur Date: April 2, 2023 2:54 PM Status: ready to start 实时响应式的扩展算法 实时响应式的扩展算法分为 1. 比例积分控制 2. 强化学习 比例积分控制方法 “We use a proportiona…

涨点技巧:Yolov5/Yolov7 引入Yolo-Z---ResneXtBottleneckCSP和DenseBlock,提升小目标检测能力

论文:https://arxiv.org/pdf/2112.11798.pdf 代码:https://github.com/shanglianlm0525/CvPytorch 本文最大贡献点: 作者尝试用ResNet思想替换YOLOv5中现有的Backbone。 ResNet是一种流行的结构,它引入残差连接来减少在深层神经网络中收益递减的影响。 DenseNet 使用类似的…

PCB模块化设计13——FLASH、DDR和eMMC高速PCB布局布线设计规范

目录PCB模块化设计13——FLASH和DDR高速PCB布局布线设计规范一、Flash高速PCB布局布线设计规范1、Flash介绍2、NOR和NAND性能比较3、 NAND Flash的用途4、FLASH管脚定义5、Nand Flash数据读取操作的时序图6、FLASH参考原理图7、 PCB布局布线设计指南1&#xff09;布局&#xff…

QT学习(四)——常用控件

4.1 文字控件&#xff1a;Label 记得添加头文件&#xff1a;#include <QLabel> 运行结果&#xff1a; 这里也可以进行有参的构造&#xff1a; 运行结果&#xff1a; 4.2 滑动条&#xff1a;QSlider 用之前记得包含头文件&#xff1a;#include <QSlider> 运…

阿里P8高级技术专家自述被裁员,疑似给市长写信,房贷月供3w,压力很大,出门面试找工作很难!...

点击上方“码农突围”&#xff0c;马上关注这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包真爱&#xff0c;请设置“星标”或点个“在看这是【码农突围】的第 436 篇原创分享作者 l 突围的鱼来源 l 码农突围&#xff08;ID&#xff1a;smartyuge&…

谷粒商城笔记+踩坑(22)——库存自动解锁。RabbitMQ延迟队列

目录 1 业务流程图 2【仓库服务】RabbitMQ环境准备 2.1 导入依赖 2.2 yml配置RabbitMQ信息 2.3 主启动类添加注解EnableRabbit 2.4 配置类&#xff0c;JSON消息转换、创建交换机、队列和绑定 2.5 导入seata依赖 3 监听库存解锁 3.0 分析 3.1 “仓库工作单” 数据库表…

python---数据容器

数据容器 1.7数据容器 1.7.1简介 1.如何一个变量定义多个数据呢&#xff1f;&#xff1f;&#xff1f; 采用容器的变量的定义的方式。可以采用容器的定义的方式&#xff0c;集合等等2.什么是数据容器&#xff1f; 可以存储多个python数据 3.常见的数据容器的类型 list元组strse…

【C4D】基础快捷键操作,布尔操作——动不了怎么办+选不上怎么办+怎么移动+怎么拉平面或拉平一圈线

前言 说惯谎言的人&#xff0c;最清楚不过承诺的脆弱&#xff0c;大多数时候&#xff0c;人们并非刻意说谎&#xff0c;他们只是对自己说出的话没有真正深入的了解——《死人经》 \;\\\;C4D——选不上是因为没有C掉 、 内部挤压等于嵌入 \;\\\;\\\;目录前言基础操作ctrl拖动面…

我给Chat GPT写了个记忆系统

ChatGPT-LifeTime OpenAI 的模型有一个固定的 Token 限制&#xff0c;例如 GPT-3 的 Davinci 模型最多可以处理2049 个 Token&#xff0c;大约 1500 个英文单词。最新 Turbo 模型大约是 4,096 个 Token&#xff0c;大约是 3000 个英文单词&#xff0c;也就是意味着Chat GPT它会…

windows 电脑图片/视频不展示预览图

文章目录windows 电脑图片/视频不展示预览图描述可能原因及解决办法1. Windows的缩略图预览功能被禁用2. 缩略图预览功能卡住3. 重新安装Windows Media Player4. 文件格式不支持预览5. 图像和视频文件损坏6. 系统文件损坏7. 第三方程序冲突windows 电脑图片/视频不展示预览图 …

Activity登堂入室

1.Activity,Window与View的关系 下面是自己查阅资料,看了下一点源码的归纳所得,如果哪写错了欢迎指出!下面贴下小结图: 流程解析:Activity调用startActivity后最后会调用attach方法,然后在PolicyManager实现一个Ipolicy接口,接着实现一个Policy对象,接着调用makeneww…

STM32学习(十三)

通用定时器简介 通用定时器有TIM2、TIM3、TIM4、TIM516位递增、递减、中心对齐计数器&#xff08;0~65535&#xff09;16位预分频器&#xff08;1~65536&#xff09;可用于触发DAC、ADC在更新事件、触发事件、输入捕获、输出比较时&#xff0c;会产生中断/DMA请求。4个独立通道…
最新文章