你是真的“C”——操作符详解【下篇】+整形提升+算术转换

news2024/11/29 10:35:12

你是真的“C”——操作符详解下篇😎

  • 前言🙌
  • 操作符详解【上篇】内容:
  • 操作符详解【下篇】内容:
    • 1、 条件操作符
    • 2、逗号表达式:
    • 3、下标引用、函数调用和结构成员
    • 3、访问一个结构的成员
  • 表达式求值
    • 1、隐式类型转换:
    • 2、整型提升的意义:
    • 算术转换
    • 操作符的属性
  • 总结撒花💞

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
在这里插入图片描述

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享C语言操作符知识点的内容~ 都是精华内容,可不要错过哟!!!😍😍😍

操作符详解【上篇】内容:

可以点击博客链接: 你是真的“C”——详细剖析操作符知识点【上篇】 访问阅读~。 😘

操作符详解【下篇】内容:

1、 条件操作符

什么是条件操作符呢?其实它是长这样子哒:exp1 ? exp2 : exp3如果exp1结果为真,则输出exp2,否则输出exp3。 如果合理的运用条件操作符,可以减少代码量~
举个栗子:

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

运用条件操作符修改上述代码:

 #include <stdio.h>
int main()
{
	int a = 3;
	int b = 0;
	b = (a > 5) ?  3 : -3;
	printf("%d", b);
	return 0;
}

程序结果运行图:

在这里插入图片描述

2、逗号表达式:

我们常说的逗号表达式的一般形式为exp1, exp2, exp3,…expn。逗号表达式,其实就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
举个栗子说明一下:

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式

c是多少? 根据逗号表达式的性质:从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 分析其运算过程首先是 a > b, 这个表达式为假得到0;a = b + 10,得到表达式的值为12;a 为12;b = a + 1,表达式的值为13,最后整个逗号表达式的结果为13赋值给c。

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

  • 下标引用操作符: [ ]其操作数:一个数组名 + 一个索引值
    举个栗子:
int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。

在上面的第二行代码中, [ ]的两个操作数是arr和9。

  • ( ) 函数调用操作符其可以接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
    举个栗子:
#include <stdio.h>
void test()
{
	printf("hehe!");
}

int main()
{
	test();//()作为函数调用操作符
	return 0;
}

程序结果运行图:
在这里插入图片描述

3、访问一个结构的成员

  • . 结构体.成员名
  • -> 结构体指针->成员名
    举个栗子:
#include <stdio.h>
struct Stu
{
	char name[10];
	int age;
};

int main()
{
	struct Stu stu = {"小明",10};
	struct Stu* pStu = &stu;

	printf("%s %d\n",stu.name ,stu.age);//.操作符运用
	printf("%s %d", pStu->name, pStu->age);//->操作符运用
	return 0;
}

程序运行结果图:
在这里插入图片描述

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型

1、隐式类型转换:

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

2、整型提升的意义:

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

接下来,举两个栗子来了解一下整形提升。
第一个栗子:

#include<stdio.h>
int main()
{
	char a = 3;
	//00000000000000000000000000000011
	//00000011-截断
	char b = 127;
	//00000000000000000000000001111111
	//01111111-截断
	
	char c = a + b;//需要提升到整形精度,再进行相加
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010
	//10000010 - c
	//已 %d 的形式打印-整型提升-有符号数按照符号位进行整形提升
	printf("%d\n", c);
	//11111111111111111111111110000010-补码
	//11111111111111111111111110000001-反码
	//10000000000000000000000001111110-原码
	//-126

	return 0;
}

程序运行结果:
在这里插入图片描述

小结一下:

1、a和b的值被提升为普通整型,然后再执行加法运算。加法运算完成之后,结果将被截断,然后再存储于c中。
2、以 %d 的形式打印-整型提升-有符号数按照符号位进行整形提升
3、整形提升是按照变量的数据类型的符号位来提升的。无符号整形提升,高位补0
4、二进制中,其最高位就是符号位。数据在内存中是已补码的形式存储的,是用原码读取的。

第二个栗子:

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

小结一下:

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

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
警告:但是算术转换要合理,要不然会有一些潜在的问题。

在这里插入图片描述

操作符的属性

总体来看,其实复杂表达式的求值有三个影响的因素

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。
    两个相邻的操作符先执行哪个?取决于他们的优先级如果两者的优先级相同,取决于他们的结合性。
    操作符优先级

但是,当我们知道影响表达式求值的三大因素后,我们对于一些代码,还是不能确定其唯一的值,这些代码就是问题代码。
举个栗子:

#include <stdio.h>
int main()
{
	int i = 1;
	int ret = (++i) + (++i) + (++i);
	printf("%d\n", ret);
	printf("%d\n", i);
	return 0;
}

在这里插入图片描述在不用的编译器,其执行的结果是不相同的。

总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。

总结撒花💞

   本篇文章旨在分享C语言操作符相关的知识点。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…

Imported target “dart“ includes non-existent path 笔记

详细问题&#xff1a;关联功能包&#xff0c;源码编译Failed <<< gazebo_ros2_control [11.8s, exited with code 1]网上查了很多资料&#xff0c;都是比较旧版&#xff0c;这里注意由于ROS2系统发展很快&#xff0c;功能包在快速集成。使用源码编译可能会遇到环境配置…

PMP报考条件?

PMP已经被认为是项目管理专业身份的象征&#xff0c;项目经理人取得的重要资质。 PMP考试一般每年在中国大陆地区&#xff0c;会进行四次考试&#xff0c;今天就来详细说一说PMP考试的时间线。 01考试时间PMP考试在中国大陆一年开展四次&#xff0c;分别在每年的3月、6月、9月…

SpringCloud(17):Sentinel简介

1 流量控制&熔断降级介绍 1.1 流量控制简介 拿旅游景点举个示例&#xff0c;每个旅游景点通常都会有最大的接待量&#xff0c;不可能无限制的放游客进入&#xff0c;比如故宫每天只卖八万张票&#xff0c;超过八万的游客&#xff0c;无法买票进入&#xff0c;因为如果超过…

软件架构设计(二)——领域架构、基于架构的软件开发方法

目录 一、架构描述语言 ADL 二、特定领域软件架构 DSSA 三、DSSA的三层次架构模型 . 四、基于架构的软件开发方法 (1)基于架构的软件设计(ABSD) (2)开发过程 一、架构描述语言 ADL ADL是一种形式化语言&#xff0c;它在底层语义模型的支持下&#xff0c;为软件系统概念体…

云安全之浅谈密钥泄露

前言 如今越来越多公司选择使用云平台&#xff0c;诸如:阿里云、腾讯云、AWS、Azure。使用云平台大大降低了企业的资源成本&#xff0c;另一方面随着公用云的普及&#xff0c;也存在着一些风险。现代应用程序需要与其他外部应用程序通信&#xff0c;并且它们需要内部服务到服务…

ESP32设备驱动-模拟输入(ADC)

模拟输入(ADC) 文章目录 模拟输入(ADC)1、ADC介绍2、ADC相关API介绍3、软件准备4、硬件准备5、代码实现本文将介绍如何使用Arduino IDE对ESP32进行模拟读取。模拟读数可用于从可变电阻式电位计或模拟传感器读取值。 1、ADC介绍 ESP32有两个ADC单元,可用于以下场景: 生成…

Echarts的Category轴滑动

Echarts的Category轴滑动 效果&#xff0c;滚轮上下可拖动 配置项 dataZoom: [// {// // disabled: false,// start: 100, //默认为0// end: 80, //默认为100// // startValue: [xArr.length - 1],// // endValue: [xArr.length - 4],// type: slide…

typora每次复制文档都要附带图片文件夹?学会配置gitee图床

0. 引言 作为开发人员&#xff0c;我们习惯使用md格式来编写文档&#xff0c;特别是typora编辑器更是日常使用的软件。但作为轻量化的文档编辑器&#xff0c;我们在默认插入图片时&#xff0c;一般typora会将图片保存到本地或者引用一个本地图片的路径 当文档还在我们本地打开…

免费IB学习资源推荐,学霸常用

看了那些学霸们分享的笔记与网站&#xff0c;深刻认识到学习的竞争&#xff0c;就是对个人资源归纳整理能力的比拼&#xff0c;想要学好IB学科&#xff0c;除了跟着自己的辅导老师积极学习以外&#xff0c;还要学会充分掌握学习资料&#xff0c;这样才能做到心中有数&#xff0…

超清遥感影像语义分割处理

分割出城市中的垃圾堆场,遂寻找到了 UrbanAtlas 2012 database 这个数据集和对应的 baseline baseline IoU for class 1: 0.5667 IoU for class 2: 0.3504 IoU for class 3: 0.0001 IoU for class 4: 0.0002 IoU for class 5: 0.4121 IoU for class 6: 0.0204 IoU for cla…

第三章:IP地址加掩码讲解和ping命令运用

IP地址加掩码&#xff1a;我打几个IP地址给你们瞅瞅。10.20.70.55/24192.168.30.2/24我写的这几个都是24位掩码的&#xff0c;/后面的是掩码位数&#xff0c;也就是是255.255.255.0。子网掩码分为三类&#xff1a;A类&#xff1a;255.0.0.0B类&#xff1a;255.255.0.0C类&#…

RMIserver端和Registry端源码分析

想学JDNI&#xff0c;那想必一定躲不过RMI。 RMI简述 RMI可以远程调用JVM对象并获取结果。所以需要一个server和一个client进行通信。 Server端会创建一个远程对象用于client端远程访问。 下面改造一张来自W3Cschool的图&#xff1a; 只需要知道&#xff1a;Client端使用st…

UE5 UI材质特效

一、扩散的光圈。效果如下&#xff1a;用ps拉一个 对称渐变 和 径向渐变对称渐变&#xff1a;用于做纹理&#xff0c;通过平面坐标到极坐标的公式&#xff0c;转换成环。径向渐变&#xff1a;用于Mask将贴图的纹理组改为 UI&#xff0c;压缩设置改为 用户界面2D。创建材质 M_Te…

Myb atis基础3

Mybatis注解开发单表操作Mybatis的常用注解Mybatis的增删改查MyBatis注解开发的多表操作MyBatis的注解实现复杂映射开发一对一查询一对多查询多对多查询构建sqlsql构建对象介绍查询功能的实现新增功能的实现修改功能的实现删除功能的实现Mybatis注解开发单表操作 Mybatis的常用…

【运筹优化】Python 实现标签算法求解 ESPPRC 问题

文章目录一、标签算法介绍二、SPPRC 问题三、ESPPRC 问题四、Python 实现标签算法求解 ESPPRC 问题4.1 Solomn 数据集4.2 完整代码4.2.1 Functions.py4.2.2 LabelAlgo.py4.2.3 Main.py4.3 结果展示4.3.1 测试案例&#xff1a;c101.txt4.3.2 测试案例&#xff1a;r101.txt一、标…

2022年38女神节大促美妆、珠宝、母婴、保健电商数据回顾

近期&#xff0c;我们陆续接收到了品牌商家朋友们对于2022年女神节大促期间部分品类的数据需求&#xff0c;希望能对今年的大促活动有一个更宏观的认知、更精准的预测&#xff0c;从而拿到更好的数据效果。 为此&#xff0c;在距离大促开启一个月的备货阶段&#xff0c;鲸参谋决…

ChatGPT真的像媒体宣传的那样“四平八稳”吗?

最近ChatGPT非常的火爆&#xff0c;曝光度很高&#xff0c;很多官方媒体和个人的自媒体公众号都进行各种追逐。有些文案写的太好了&#xff0c;真的都要信了。其中有一篇“遨游四海&#xff0c;惊艳于某州”类似旅游宣传的文案。为了测试一下于是仿照他们的问话方式对ChatGPT进…

【服务器数据恢复】服务器raid5故障导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器内搭建2组raid5磁盘阵列&#xff0c;每组raid5阵列包含4个磁盘&#xff0c;2组阵列都划分为lun并组为lvm结构&#xff0c;采用的ext3文件系统。 服务器故障&#xff1a; 一直raid5磁盘阵列中的一块硬盘由于未知故障离线&#xff0c;此时该…

【4】深度学习之Pytorch——如何使用张量处理时间序列数据集(共享自行车数据集)

表格数据 表格中的每一行都独立于其他行&#xff0c;他们的顺序页没有任何关系。并且&#xff0c;没有提供有关行之前和行之后的列编码信息。 表格类型的数据是指通过表格的形式表示的数据&#xff0c;它以行和列的方式组织数据。表格中的每一行代表一个数据项&#xff0c;每…