当前课程知识点:C语言程序设计 > 第3章 基本数据类型、运算符与表达式 > 3.4 如何进行算术运算 > 如何进行算术运算
同学们大家好
在前面的课程中我们介绍了C语言中的基本数据类型
同时我们也了解这些数据类型在计算机中是以
常量和变量的形式表现出来的
在日常生活中可以用C语言编写程序
来解决实际问题
如在超市购物计算商品的价格
旅游前制定行程计划和花销预算等
所以说所有的程序都需要对数据进行加工处理
否则程序就没有意义
这时我们就需要使用运算符对数据进行处理
这节课我们来讲解C语言的运算符
和表达式C语言的运算符极其丰富
根据运算符的性质分类
C语言的运算符可分为算术运算符
关系运算符
逻辑运算符
赋值运算符
条件运算等
我们来看这样一个表达式
12+3*2-6/3 按照先乘除后加减
同级从左至右的原则
这个表达式的执行顺序是先执行3乘2
再执行6除3
然后依次从左到右完成12+6-2
最后得到结果16
在C语言要正确使用运算符
必须清楚这种运算符优先级和结合性
C语言中不同的运算符具有不同的优先级
在计算表达式的值时
先计算优先级比较高的运算符
如果表达式中运算符的优先级相同
还要按照运算符的结合方向确定计算的先后次序
通常单目运算符比双目运算符的优先级高
下面我们先介绍C语言中的算术运算符
算术表达式
C语言提供的算数运算符以及
优先级和结合性如下表所示
需要说明是
1.在C语言中用*代替数学上的×
用斜杠代替数学上的÷
2.在C语言中如果两个操作数均为整数相除
结果为整数
下面我们来看几个例子
编写简单程序进行5/3的运算
编译运行后结果值为1
舍去小数部分
那么如果除数或被除数中有一个为负数
结果会如何呢
依据不同的编译系统结果有所不同
比如将上例中的5改成-5/3
有的系统中得到的结果为-1
在有的系统中则得到结果为-2
在VC中采取向零取整的方法
也就是说取整后向零靠拢
现在我们来运行程序
输出结果为-1
上面我们看到的都是整型数据的运算
实型数据是如何进行除法运算的呢
在除法运算中如果两个操作数中有一个是浮点数
完成的是浮点数除法
编程实现1.0/2的运算
编译运行后结果值为0.500000
缺省默认6位小数
3
求余运算符要求参加运算的运算对象(即操作数)为整型数据
结果也是整型数据
现在我们通过下面的程序来学习求余运算符
编译运行后的结果如图所示
我们分别对变量X进行不同的赋值
分析它的结果
这时我们发现
当被除数为负数时
得到的余数的结果也为负数
当被除数为正数时
得到的余数为正数
由此我们等到一个结论
求余运算的正负取舍和被除数符号相同
用运算符和括号将运算对象如常量
变量和函数等连接起来的
符合C语言语法规则的式子
就称之为表达式
表达式中的运算符都是算术运算符的
表达式称之为算术表达式
如
3 + 5 * 8- (x + y) / 2 - 1等
我们可以看到在一个表达式可以包含2个或更多算术运算符
在表达式中可以使用括号改变运算顺序
如表达式( 10 – ( 3 + 1 ) ) * 2 =
在这个表达式中先执行最内层括号中的运算3+1
在再执行外层括号中的运算10-(3+1)
最后执行括号外的运算
得到结果12
在C语言中除了所讲的算术运算符外
还提供了两个用于算术运算的单目运算符自增自减
自增自减运算符的作用是使变量值加1或减1
首先我们来看运算符的形式
用两个连续的++或--表示
优先级与负号运算符同属于2级单目运算符
结合方向自右向左
自增自减运算符有以下两种用法
前置运算
运算符放在变量之前如
++i
--i
先执行自加或自减
再取i值参与其他运算
后置运算
运算符放在变量之后如
j++
j--
先取j的值参与其他运算
再执行自加或自减
下面我们编程验证
给变量j
赋初值2
在第4行语句中
变量 j首先完成自加
这时j为3
再执行j+1操作
得到最终结果4
在第6行语句中
先取变量j的值3
输出-3
然后j变量做自加操作
这时候的变量j的值为4
在第8行语句中
变量j先自减
然后输出3
这时就的值为 3
在第10行语句中
先取变量j的值3
输出-3
然后j变量做自减操作
这时候的变量j的值为2
使用自增
自减运算符要注意以下几个方面
①自增自减运算符只能用于变量
不能用于常量和表达式
因为++和--蕴含着赋值操作
例如
5++
--
a+b
都是非法的表达式
②负号运算符
++--等优先级相同运算符
当这些运算符连用时
按照从右向左的顺序计算
例如
-i++ 等价于 -(i++)
③在表达式中有多个连续的运算符时
C编译系统在处理时尽可能多的自左而右
将多个运算组成一个运算符
例如
i+++j等价于
(i++)+j
而不是i+(++j)
④在表达式中
连续使同一变量进行自增或自减运算时
很容易出错
所以最好避免这种用法
例如:++i++是非法的
⑤
自增自减运算
常用于循环语句中
使循环控制变量加1或减1
以及指针变量中
使指针指向下或向上一个地址
在C程序设计中
为保证良好的程序设计风格
建议在一行语句中
一个变量只能出现一次增1或者减1操作
因为过多的增1和减1运算混合
不仅使程序的可读性差
而且还因为编译器实现的方法不同
导致不同编译器产生不同的运行结果
对于多数C编译器
利用自增自减运算生成的代码
比等价的赋值语句生成的代码运行效率高
但要确保所编写的程序的可读性
不要写别人看不懂的
也不知道系统会怎样执行的程序
正所谓简单就是美
同学们
下次课再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写