第5章 运算符、表达式和语句

news2025/1/9 10:20:14

本章介绍以下内容:
关键字:while、typedef
运算符:=、-、*、/、%、++、--、(类型名)
C语言的各种运算符,包括用于普通数学运算的运算符
运算符优先级以及语句、表达式的含义
while循环
复合语句、自动类型转换和强制类型转换
如何编写带有参数的函数
现在,读者已经熟悉了如何表示数据,接下来我们学习如何处理数据。C 语言为处理数据提供了大量的操作,可以在程序中进行算术运算、比较值的大小、修改变量、逻辑地组合关系等。我们先从基本的算术运算(加、减、乘、除)开始。
组织程序是处理数据的另一个方面,让程序按正确的顺序执行各个步骤。C 有许多语言特性,帮助你完成组织程序的任务。循环就是其中一个特性,本章中你将窥其大概。循环能重复执行行为,让程序更有趣、更强大。

5.1 循环简介

5.2 基本运算

5.2.1 赋值运算符:=

用于储存值的数据存储区域统称为数据对象(data object)

左值(lvalue)是 C 语言的术语,用于标识特定数据对象的名称或表达式

可修改的左值(modifiable lvalue),用于标识可修改的对象。

右值(rvalue)指的是能赋值给可修改左值的量,且本身不是左值

5.2.2 加法运算符:+

5.2.3 减法运算符:-

+和-运算符都被称为二元运算符(binary operator),即这些运算符需要两个运算对象才能完成操作

5.2.4 符号运算符:-和+

以这种方式使用的负号被称为一元运算符(unary operator)。一元运算符只需要一个运算对象

5.2.5 乘法运算符:*

5.2.6 除法运算符:/

浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。这使得5除以3很让人头痛,因为实际结果有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断(truncation)

整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果。混合整数和浮点数计算的结果是浮点数

5.2.7 运算符优先级

表5.1 运算符优先级(从低至高)

5.2.8 优先级和求级顺序

5.3 其他运算符

5.3.1 sizeof运算符和size_f类型

sizeof运算符以字节为单位返回运算对象的大小

C 语言规定,sizeof 返回 size_t 类型的值。这是一个无符号整数类型,但它不是新类型。前面介绍过,size_t是语言定义的标准类型

C99 做了进一步调整,新增了%zd 转换说明用于 printf()显示 size_t 类型的值。如果系统不支持%zd,可使用%u或%lu代替%zd。

5.3.2 求模运算符:%

求模运算符只能用于整数,不能用于浮点数

5.3.3 递增运算符:++

a_post = a++;   // 后缀:使用a的值乊后,递增a
b_pre= ++b;    // 前缀:使用b的值乊前,递增b

5.3.4 递减运算符:--

5.3.5 优先级

5.3.6 不要自作聪明

5.4 表达式和语句

5.4.1 表达式

表达式(expression)由运算符和运算对象组成

每个表达式都有一个值

5.4.2 语句

语句(statement)是C程序的基本构建块。一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾

最简单的语句是空语句:
;   //空语句

副作用是对数据对象或文件的修改

序列点(sequence point)是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生

5.4.3 复合语句(块)

复合语句(compound statement)是用花括号括起来的一条或多条语句,复合语句也称为块(block)

缩进对编译器不起作用

缩进是为了让读者一眼就可以看出程序是如何组织的

总结 表达式和语句
表达式:
表达式由运算符和运算对象组成。最简单的表达式是不带运算符的一个常量或变量(如,22 或beebop)。更复杂的例子是55 + 22和vap = 2 * (vip + (vup = 4))。
语句:
到目前为止,读者接触到的语句可分为简单语句和复合语句。简单语句以一个分号结尾。如下所示:
赋值表达式语句:   toes = 12;
函数表达式语句:   printf("%d\n", toes);
空语句:      ;  /* 什么也不做 */
复合语句(或块)由花括号括起来的一条或多条语句组成。如下面的while语句所示:
while (years < 100)
{
wisdom = wisdom * 1.05;
printf("%d %d\n", years, wisdom);
years = years + 1;
}

5.5 类型转换

1.当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与int的大小相同,unsigned short就比int大。这种情况下,unsigned short会被转换成unsigned int)。在K&R那时的C中,float会被自动转换成double(目前的C不是这样)。由于都是从较小类型转换为较大类型,所以这些转换被称为升级(promotion)。
2.涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
3.类型的级别从高至低依次是long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int、int。例外的情况是,当 long 和 int 的大小相同时,unsigned int比long的级别高。之所以short和char类型没有列出,是因为它们已经被升级到int或unsigned int。
4.在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级(demotion)。所谓降级,是指把一种类型转换成更低级别的类型。
5.当作为函数参数传递时,char和short被转换成int,float被转换成double。第9章将介绍,函数原型会覆盖自动升级。

如果把一个浮点值转换成整数类型会怎样?当浮点类型被降级为整数类型时,原来的浮点值会被截断

强制类型转换(cast),即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符(cast operator),其通用形式是:
(type)
用实际需要的类型(如,long)替换type即可。

总结 C的一些运算符
下面是我们学过的一些运算符。
赋值运算符:
= 将其右侧的值赋给左侧的变量
算术运算符:
+    将其左侧的值与右侧的值相加
-    将其左侧的值减去右侧的值
-    作为一元运算符,改变其右侧值的符号
*    将其左侧的值乘以右侧的值
/    将其左侧的值除以右侧的值,如果两数都是整数,计算结果将被截断
%    当其左侧的值除以右侧的值时,取其余数(只能应用于整数)
++    对其右侧的值加1(前缀模式),或对其左侧的值加1(后缀模式)
--    对其右侧的值减1(前缀模式),或对其左侧的值减1(后缀模式)
其他运算符:
sizeof    获得其右侧运算对象的大小(以字节为单位),运算对象可以是一个被圆括号括起来的类型说明符,如sizeof(float),或者是一个具体的变量名、数组名等,如sizeof foo
(类型名)   强制类型转换运算符将其右侧的值转换成圆括号中指定的类型,如(float)9把整数9转换成浮点数9.0

5.6 带参数的函数

5.7 示例程序

5.8 关键概念

5.9 本章小结

C 语言有许多运算符,如本章讨论的赋值运算符和算术运算符。一般而言,运算符需要一个或多个运算对象才能完成运算生成一个值。只需要一个运算对象的运算符(如负号和 sizeof)称为一元运算符,需要两个运算对象的运算符(如加法运算符和乘法运算符)称为二元运算符。
表达式由运算符和运算对象组成。在C语言中,每个表达式都有一个值,包括赋值表达式和比较表达式。运算符优先级规则决定了表达式中各项的求值顺序。当两个运算符共享一个运算对象时,先进行优先级高的运算。如果运算符的优先级相等,由结合律(从左往右或从右往左)决定求值顺序。
大部分语句都以分号结尾。最常用的语句是表达式语句。用花括号括起来的一条或多条语句构成了复合语句(或称为块)。while语句是一种迭代语句,只要测试条件为真,就重复执行循环体中的语句。
在C语言中,许多类型转换都是自动进行的。当char和short类型出现在表达式里或作为函数的参数(函数原型除外)时,都会被升级为int类型;float类型在函数参数中时,会被升级为double类型。在K&R C(不是ANSI C)下,表达式中的float也会被升级为double类型。当把一种类型的值赋给另一种类型的变量时,值将被转换成与变量的类型相同。当把较大类型转换成较小类型时(如,long转换成short,或 double 转换成 float),可能会丢失数据。根据本章介绍的规则,在混合类型的运算中,较小类型会被转换成较大类型。
定义带一个参数的函数时,便在函数定义中声明了一个变量,或称为形式参数。然后,在函数调用中传入的值会被赋给这个变量。这样,在函数中就可以使用该值了。

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

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

相关文章

虚拟机不能使用 console 的问题

原理&#xff1a;arm 系统默认走ttyAMA0&#xff0c;x86 默认走ttyS0&#xff0c;而tty0 是走的GPU 串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。 计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备…

6.6.tensorRT高级(1)-mmdetection框架下yolox模型导出并推理

目录 前言1. yolox导出2. yolox推理3. 补充知识3.1 知识点3.2 mmdetection 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习…

Spring Boot介绍--快速入门--约定优于配置

文章目录 SpringBoot 基本介绍官方文档Spring Boot 是什么?SpringBoot 快速入门需求/图解说明完成步骤快速入门小结 Spring SpringMVC SpringBoot 的关系总结梳理关系如何理解-约定优于配置 SpringBoot 基本介绍 官方文档 官网: https://spring.io/projects/spring-boot 学习…

JUC之线程中断与LockSupport

什么是中断 首先一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应该由线程自己自行停止。其次在Java中没有办法立即停止一条线程&#xff0c;然而停止线程却显得尤为重要&#xff0c;如取消一个耗时操作。因此&#xff0c;Java提供了一种用于停止线程的机制——中…

goanno的简单配置-goland配置

手动敲注释太LOW,使用插件一步搞定 goanno 打开goanno的配置 点击之后弹窗如下 配置method /** Title ${function_name} * Description ${todo} * Author zhangguofu ${date} * Param ${params} * Return ${return_types} */相关效果如下 同理配置interface // ${interface…

el-select控制单选还是多选

<el-form :inline"true" :model"form" class"demo-form-inline"><el-form-item><el-select v-model"form.properties_id" placeholder"请选择样品性质" clearable :multiple"multiple_properties"…

web前端之CSS

文章目录 一、CSS简介1.1 CSS语法规则 二、CSS的引用方法2.1 定义行内样式表2.2定义内部样式表2.3链入外部样式表2.4导入外部样式表 三、CSS选择符3.1 基本选择符3.1.1 标签选择符3.1.2 class类选择符3.1.3 id选择符 3.2 复合选择符3.2.1 交集选择符&#xff08;合并选择器&…

Navicat连接SQL Server报错:IM002 未发现数据源名称且未指定驱动

Navicat Premium连接SQL Server软件时&#xff1a;报IM002错误&#xff0c;未发现数据源名称且未指定驱动程&#xff1a; 解决办法&#xff1a;查找Navicat Premium的安装目录D:\Navicat Premium\&#xff0c;你会找到一个文件sqlncli_x64.msi&#xff08;D:\Navicat Premium\s…

【数字化处理】仿生假体控制中肌电信号的数字化处理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在win10, win11 家庭版中安装远程桌面服务

win10&#xff0c; win11 家庭版中提供远程桌面服务 简介 在windows家庭版中&#xff0c;是不提供远程桌面服务的&#xff0c;你没有办法使用远程桌面连接到windows家庭版中。 当然&#xff0c; 你可用升级windows 版本到专业版&#xff0c;这样就可用享受到windows自带的远程…

今年这情况,真想考研了!

眼下&#xff0c;又是一年的毕业季&#xff0c;超千万规模的毕业生大军如“丧尸围城”&#xff0c;浩浩荡荡地涌入职场。与他们一路同行的还有因疫情影响2022年离校未就业的毕业生&#xff0c;以及那些不幸“被优化”的职场人。 今年&#xff0c;1158 万毕业生&#xff0c;再加…

浅谈城市大型综合体周边商铺电气防火和消防设备监督管理的几点建议

安科瑞 华楠 【摘要】随着经济的发展及城市化步伐的加快&#xff0c;城市建筑密度及建筑容积都达到了空前规模&#xff0c;大型综合体及周边商铺的发展&#xff0c;给人们的日常生活消费提供了便利条件&#xff0c;但同时给人们带来的火灾危险却不能忽视。本文从装修设计情况、…

基于fpga的电子时钟

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表按键消抖模块&#xff08;key&#xff09;计数器模块&#xff08;counter&#xff09;蜂鸣器乐谱模块(music)蜂鸣器发声…

Shadow插件化框架使用

作者&#xff1a;CCtomorrow 说明 最近项目想要做模块动态升级&#xff0c;所以了解了最近还在维护的插件化框架 Shadow . shadow框架的官网的顶置 issue &#xff0c;里面有非常多的关于框架的解析的文章。想要了解此框架&#xff0c;这个必看。 这里还是截取一张项目代码图…

Drools用户手册翻译——第四章 Drools规则引擎(十二)复杂事件处理(CEP)的时间操作

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 对于事件的时间…

Python数据分析实战-dataframe指定多列去重(附源码和实现效果)

实现功能 Python数据分析实战-利用df.drop_duplicates(subset[,])对dataframe指定多列去重 实现代码 import pandas as pddata{state:[1,1,2,2,1,2,2],pop:[a,b,c,d,b,c,d]} framepd.DataFrame(data)frameframe.drop_duplicates(subset[pop,state]) print(frame) 实现效果 本…

【SpringCloud】RabbitMQ基础

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;…

Unity Git项目添加子模块

在 当前仓库根目录下执行命令 git submodule add https://github.com/xxx/child.git 检查仓库状态 git status 更新子库 git submodule update --remote 下拉父仓库Git并保住子库也更新 git pull --recurse-submodules 推荐使用 Githubdesktop工具 这样你可以更清楚的看到自己…

前端如何设置表单元素的默认值?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文本框、文本域⭐ 单选按钮、复选框⭐ 对于下拉列表⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

全网最强,Jmeter性能测试-web接口性能压测总结(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 压测的目的 对于…