C语言初阶——5操作符

一、算数操作符

在这里插入图片描述

  1. 除了% 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于/ 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除
    法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

1、类型转换

C语言中整数除以整数还是整数,直接把小数部分给舍去了,如果两个不同类型的变量进行算数运算,就会触发隐式类型转换有一个内置的转换规则,短的往长的转(int 和 double 这两个,double长)

  • 例子1
#include<stdio.h>int main()
{//5 -> int//5.0 -> double//5.0f ->floatint a = 5;int b = 2;printf("%d\n",a / b);return 0;
}

在这里插入图片描述

  • 例子2:
#include<stdio.h>int main()
{//5 -> int//5.0 -> double//5.0f ->floatdouble a = 5.0;int b = 2.0;printf("%f\n", a / b);return 0;
}

在这里插入图片描述

  • 例子3
#include<stdio.h>int main()
{//5 -> int//5.0 -> double//5.0f ->floatint a = 5;int b = 2;printf("%f\n", (double)a / b);return 0;
}

在这里插入图片描述
这里涉及到了——强制类型转换(显示类型转换)

  • 例子4——交换函数如果调用的时候没有解引用会发生什么?
void swap(int* x, int* y)
{int tem = *x;*x = *y;*y = tem;
}
int main()
{int a = 5;int b = 2;swap(a, b);

在这里插入图片描述
这里将swap(a,b)传入的的int型a,b,会在swap函数中隐式自动转换为int*
函数中就是(int * 5, int *2)下面 *5 和 2,表示将地址为5的内存进行解引用 和地址为2的内存解引用了——这两块内存我们是不能用的,只有自己申请的内存我们才能使用(自己创建变量才会申请空间~)
编译器没有报错,但是最后程序会崩溃,说明编译器会自动把int隐式转换为 int
,这是一件非常让人讨厌的事情 。代码出错了但是并没有直接给出错误提示。

做出了这样的分类:
如果这个语言越支持隐式类型转换,称为类型越弱
如果这个语言越不支持隐式类型转换,称为类型越强~
一般总结——强类型好于弱类型;静态类型好于动态类型

2、运算符优先级

	printf("%d\n",2+3*5);

结果是多少
在这里插入图片描述

二. 移位运算符

1.左移运算符 <<

#include<stdio.h>int main()
{int a = 10;printf("%d\n", a << 33);return 0;
}

在这里插入图片描述
在这里插入图片描述

2. 右移运算符 >>

三、位操作符

  • &

  • |

  • ^
    异或的重要特性:
    a^0 -> a
    a^a ->0

  • 练习

#include<stdio.h>int main()
{int a = 1;int b = 2;//printf("%d\n", a^   b);printf("%x\n", ~a);return 0;
}

在这里插入图片描述

  • 练习:
    编写代码实现:求一个整数存储在内存中的二进制中1的个数。
#include<stdio.h>//如何计算一个数的二进制中有几个1
//转换为如何取出一个数字的每一位,判断是否为1
int bitoneCount(int num) {int count = 0;for (int i = 0; i < 32; i++){if (num & (1 << i)) {count++;}}return count;
}

四、 赋值操作符

注意区分一下赋值和初始化的区别~~
赋值:变量已经有了,进行修改
初始化:第一次创建变量,设置一个值

eg:
在这里插入图片描述

五、单目操作符

5.2 sizeof和数组

编译期间求值。

5.3 强制类型转换

1.在C语言中的使用

	int a = 10;double b = (double)a;
	int a = 0x11223344;short b = (short)a;//int 4个字节(-21亿~21亿也是0~42亿9千万)   short 2个字节(0~65535 也是-32768-32768)printf("%x\n", b);

在这里插入图片描述
这里强制类型转换有一个从int强转为short ,会出现直接截断现象

反过来:

	short a = 0xF122;int b = (int)a;//int 4个字节(-21亿~21亿也是0~42亿9千万)   short 2个字节(0~65535 也是-32768-32768)printf("%x\n", b);

在这里插入图片描述
前面补的是符号位~short 0xF122-> 0000 0000 0000 0000 1111 0001 0010 0010
从short转到int 的时候 转换为 1111 1111 1111 1111 1111 0001 0010 0010

short a = 0x1122;int b = (int)a;//int 4个字节(-21亿~21亿也是0~42亿9千万)   short 2个字节(0~65535 也是-32768-32768)printf("%x\n", b);

在这里插入图片描述
前面补的是符号位~short 0x1122-> 0000 0000 0000 0000 0001 0001 0010 0010
从short转到int 的时候 转换为 0000 0000 0000 0000 0000 0001 0010 0010

小结:
从长的往短的强转的时候,直接截断高位,
从短的往长的强转的时候,填充的都是符号位
把short强转为int的时候,前面高位两个字节,填充的都是符号位;
把int强转为short的时候,前面高位的两个字节,就直接舍去不要了。
隐射类型转换也是类似的规则~~

六、关系操作符

=
< >
<=
!= 用于测试“不相等”
== 用于测试“相等”

七、 逻辑操作符

&& 逻辑与
|| 逻辑或

八、条件操作符

九、逗号表达式

exp1, exp2, exp3, …expN

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

1.[ ] 下标访问操作符

操作数:一个数组名 + 一个索引值
在我们C语言中数组和指针都可以进行[ ]操作。

  • 对数组来说[ ] 的有效下标范围 是【0,length-1】,如果下标越界,就会出现未定义行为~
  • 对于指针来说 【】范围就不好确定

2.( ) 函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
在这里插入图片描述

  • 函数指针:是一个变量,里面存了个整数,是一个内存地址 ,那我们创建一个函数,是如何到内存中去的?
  • 分析一下这个过程:
  1. 编译:把.c文件变成二进制exe文件
  2. 运行:双击 exe 文件,让系统执行程序。(exe文件中包含了CPU运行时要执行的指令,以及依赖的数据,原来在.c文件中写的函数就被转换为二进制的机器指令存放到exe文件中)

3.访问一个结构的成员

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

十一、 表达式求值

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

12.1 隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

  1. 不同类型 的变量相互赋值的
  2. 不同类型的变量混合运算

一个16进制数是4个比特位,两个16进制数是8个比特位(一个字节),四个16进制是2个字节 也就是一个short

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

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

相关文章

Simplicity Studui V5 新安装后无法Product Updates

之前&#xff08;2021年&#xff09;在SiliconLabs官网下载了SSV5&#xff0c;安装包我也保存在硬盘了&#xff0c;最近换了台电脑安装SSV5后安装 SDK之前必须Product Updates&#xff0c;但死活安装不上&#xff0c;老是提示发生了错误。来来回回卸载安装几十遍&#xff0c;后…

每日新闻掌握【2024年5月24日 星期五】

2024年5月24日 星期五 农历四月十七 TOP大新闻 卫龙因缺斤少两致歉并开展自查 5月23日&#xff0c;卫龙官方账号发布致消费者的一封信。信中提到&#xff1a;针对近日消费者反馈的15g魔芋爽存在克重不足的情况我们表示诚挚的歉意。产品质量是卫龙的重中之重。卫龙已经与相关消…

瓦解信息茧房,IPWO打破“墙”的限制

国外与国内的网络之间隔着一道无形的“墙”&#xff0c;这面“墙”让我们避免了海外不法分子的窥视&#xff0c;保护了我们的网络隐私。但是&#xff0c;“墙”的存在同样阻止了我们访问全球网络&#xff0c;获取海外资源&#xff0c;形成巨大的信息茧房。 越来越多的人渴望撕开…

Plant Simulation 双深位立库开发系列教程-出入口参数化

上一节讲到货架参数化,这一节我们继续讲出入口参数化,先看我们需要达到的效果,在Conveyor增加一个出入口设置功能,用户可以通过该功能设置多个出入口 步骤1:创建ConveyorList 在RackLane中新建一个表格ConveyorList,用于存储用户的设置参数 表格设置名字、类型、方向 、…

c# 基础 .net core、.net framework、c#、mono之间的关系

它们都是微软旗下的产品.NET Framework 主要针对window环境开发&#xff0c;是一套开发框架&#xff0c;它包含了大量的类库和运行时环境&#xff08;CLR&#xff09;&#xff0c;支持多种编程语言&#xff0c;包括 C#。- .NET Framework 的版本&#xff08;如 4.5、4.6、4.7 …

Docker配置国内镜像源

添加Docker国内镜像源 在/etc/docker/daemon.json文件中添加以下内容&#xff1a; {"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] }重启docker s…

Java enum 枚举类

Java Enum 枚举类 概述 枚举类型本质上也是一种类&#xff0c;只不过是这个类的对象是有限的、固定的几个&#xff0c;不能让用户随意创建。 如果针对于某个类&#xff0c;其实例是确定个数&#xff0c;则推荐将此类声明为枚举类。 如果枚举类的实例只有一个&#xff0c;则可…

paligemma、Grounding-DINO-1.5简单无需标注无需训练直接可以使用的VLM图像到文本模型

1、paligemma 参考:https://github.com/google-research/big_vision/blob/main/big_vision/configs/proj/paligemma/README.md 模型架构: 文本与图像特征一起送入大模型 在线体验网址: https://huggingface.co/spaces/big-vision/paligemma 通过文字prompt既可与图片对话…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

HCIP-Datacom-ARST自选题库__MPLS判断【道题】

1.在MPLS网络中&#xff0c;每台设备依然要遵循最长匹配原则&#xff0c;即每台设备都要有到达目的IP地址的路由&#xff0c;否则网络设备会丢弃收到的MPLS报文。 2.在MPLS网络中&#xff0c;运行DP协议的SR之间通过交换LDP消息来实现邻居发现、会活建立与维护以及标签管理等功…

Java 9的模块化系统(JPMS):探讨Java 9引入的模块化系统,并解释其对Java生态的影响

Java 9 模块化系统(JPMS)简介 Java 9 模块系统,也被称为 Java 平台模块系统 (JPMS),它是 Java 9 的核心特性之一,用于改进 Java 的大型应用的封装性和可维护性。 JPMS 的主要功能如下: 模块化代码:JPMS 允许你将代码库划分为不同的模块,在没有显示声明的情况下,模…

QT creator centralwidget前面有个禁止符号

centralwidget前面有个禁止符号&#xff1a;表示分拆布局 在主窗口空白处&#xff0c;右键&#xff0c;选择布局即可选择不同的布局方式&#xff0c;表示对窗口内所有控件部件进行布局&#xff0c;不如垂直布局。

AI商业化之路:开源大模型VS闭源大模型

开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 简介&#xff1a;评价一个AI模型“好不好”“有没有发展”&#xff0c;首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径&#xff0c;你更看好哪一种呢&#xff1f; 探讨开源大模型和闭源大模型在商…

【机器学习】—机器学习和NLP预训练模型探索之旅

目录 一.预训练模型的基本概念 1.BERT模型 2 .GPT模型 二、预训练模型的应用 1.文本分类 使用BERT进行文本分类 2. 问答系统 使用BERT进行问答 三、预训练模型的优化 1.模型压缩 1.1 剪枝 权重剪枝 2.模型量化 2.1 定点量化 使用PyTorch进行定点量化 3. 知识蒸馏…

线性回归 10 种图表 上【建议收藏】

这段时间&#xff0c;不少同学提到了一些图表的问题。 每次在使用matplotlib画图&#xff0c;运用这些图表说明问题的时候&#xff0c;很多时候是模糊的&#xff0c;比如说什么时候画什么图合适&#xff1f; 其实这个根据你自己的需求&#xff0c;自己的想法来就行。 今天的…

不是人人都懂的学习要点

不是人人都懂的学习要点_什么叫独特?别人都学的东西,人人都懂的东西咱就不学了,学别人知道的少的东西-CSDN博客

高光谱成像技术简介,怎么选择成像方案?

目录 一、什么是光谱&#xff1f;二、光谱和光谱分析方法的类型三、多光谱和高光谱的区别四、高光谱在水果品质检测中的应用1. 高光谱成像系统2. 高光谱图像的获取方式3. 高光谱图像处理与分析4. 在水果品质检测中的应用总结 五、针对自己的应用场景怎么使用高光谱技术六、参考…

海山数据库(He3DB)从方法到实践,构建以场景为中心的体验管理体系

编者按&#xff1a;体验优化的过程中设计师经常会遇到几个阶段&#xff0c;发现问题、定义问题、优化问题、查看反馈&#xff0c;但在产品快速迭代的过程中&#xff0c;体验的问题经常被归类到“不紧急”需求中&#xff0c;并逐步转为长尾问题&#xff0c;这些不被重视的问题聚…

重组蛋白表达中的质粒构建流程-卡梅德生物

我们在进行重组蛋白表达服务时&#xff0c;首先要根据序列特点合成基因并构建到合适的载体上。重组蛋白表达中的质粒构建是一个复杂但关键的过程&#xff0c;它涉及到将目标基因&#xff08;即编码所需蛋白质的基因&#xff09;插入到适当的质粒载体中&#xff0c;以便在后续的…

【OpenGL实践10】关于几何着色器

目录 一、说明 二、几何着色器 2.1 设置 2.2 基本几何着色器 2.2.1 输入类型 2.2.2 输出类型 2.2.3 顶点输入 2.2.4 顶点输出 2.3 创建几何着色器 2.4 几何着色器和顶点属性 三、动态生成几何体 四、结论 练习 一、说明 几何着色器的应用比较高级&#xff0c;关于…