1、第3章 简单的运算符和表达式,于水 ,2/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,3/68,运算符,再看一次上节的例子,Example: int x,y,z,m,n; x = 12;z = y = 20;n = ( m = (z + 10);,运算符,4/68,运算符,运算符和操作数,5/68,运算符,运算符的分类 一元运算符 只需要一个操作数的运算符 如取相反数运算:-(2) 二元运算符 三元运算符需要三个操作数的运算符 条件运算符(10)?1:0,6/68,算术运算符,常见的运算符(课
2、本附录C) 算术运算符 赋值运算符 类型强转 增和减 关系运算符 逻辑运算符 位运算符,7/68,算术运算符,算术运算符 加(+) 减(-) 乘(*) 除(/) 取余(%),8/68,算术运算符,算术运算符 加(+) A = 1 + 2; A = 1.0 + 2 减(-) A = 1 - 2; A = 1.0 - 2,9/68,算术运算符,算术运算符 乘(*) A = 1 * 2; A = 1.0 * 2; 是“*”不是“X”,10/68,算术运算符,算术运算符 除(/) A = 10 / 2; A = 10.0 / 2; 是“/”不是“” 下面两式的结果是否一样? A = 1 / 2; A
3、= 1.0 / 2;,11/68,算术运算符,算术运算的计算结果数据类型 整数操作 结果仍为整型 A = 1 / 2;A = ? 浮点数操作 结果为浮点型 A = 1.0 / 2;A=?,12/68,算术运算符,算术运算符 取余(%) A = 10 % 3; A=? 余数的符号与被除数相同 A = (-10) % (3); A=? A = 10 % (-3); A=? 操作数只能为整型 A = 10 % (3.0);,13/68,算术运算符,算术运算符 计算下面的表达式结果 A = -3 * 2 % 4 + 3 - 1;A=?,14/68,算术运算符,算术运算符的结合性与优先级 结合性 取相反
4、数:从右向左 其余:从左向右 优先级 取相反数:最高 *、/、%:次之 +、-:最低,15/68,算术运算符,再看一下 计算下面的表达式结果 A = -3 * 2 % 4 + 3 - 1;A=?A=( (-3) * 2) % 4) + 3) - 1,(-3),*,2,%,4,+,3,-,1,-6,-2,1,0,16/68,算术运算符,圆括号的作用 使运算更清晰 保证表达式的正确性 A = -3 * 2 % (4 + 3) - 1; A = -3 * 2 % 4 + 3 - 1;,17/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强
5、制类型转换运算符常用的标准数学函数,18/68,赋值运算符,赋值运算符 简单赋值 A = 20; 多重赋值 A = (b = (20 + 1); 简写的复合赋值 +=、-=、*=、/=、%=,19/68,赋值运算符,简写的复合赋值 以+=运算符为例 A += 表达式;等价于A = A + (表达式);书写简洁 执行效率更高,A += 20 ;等价于 A = A + 20; A += B * 20;等价于 A = A + (B * 20);,20/68,赋值运算符,所有的复合赋值,21/68,赋值运算符,例一,已知 int a = 3; 执行 a += a -= a * a 后,变量a的值?a
6、+= a -= a * aa += a -= 9a += -6a = -12,3,-6,-12,22/68,赋值运算符,例二,执行 a += a -= a *= a 后,变量a的值?a += a -= a *= aa += a -= 9a += 0a = 0,3,9,0,0,23/68,赋值运算符,编程实例 计算并输出一个三位整数的个位、十位和百位数字之和 如153,个位,十位,百位分别为1、5、3 如何取出个、十、百位?,24/68,赋值运算符,分析这个例子153 = 1 * 102 + 5 *101 + 3*1001 = 153 / 1005 = (153 - 1*100 )/ 103 =
7、 (153 - 1*100 - 5*10),25/68,赋值运算符,流程图,26/68,赋值运算符,编写程序,27/68,赋值运算符,流程图的画法,起始或终止,处理内容,处理过程,判断内容,二分支判断,是,否,流程状态变化,28/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,29/68,加1运算符和减1运算符,自加1运算符(increment operator) 对变量本身执行加1操作 表示形式 变量名+:先使用后加1 +变量名:先加1后使用 示例 int n = 3; m = n+; m=?
8、int n = 3; m = +n; m=?,3,4,30/68,加1运算符和减1运算符,自减1运算符(decrement operator) 对变量本身执行减1操作 表示形式 变量名-:先使用后减1 -变量名:先减1后使用 示例 int n = 3; m = n -; m=? int n = 3; m = - n; m=?,3,2,31/68,加1运算符和减1运算符,示例,Example: int i = 3 , j = 4; int k; k = +i + j- + i+ - -j ; printf(“i=%d j=%d k=%d“,i,j,k);,Analysis: i+; k = i
9、+ j ; k += i j-; k -= j; i+; j-;,(,),(,(,),),32/68,加1运算符和减1运算符,表达式中的加1、减1运算符 “变量名-”或“变量名+”的形式 整个表达式执行完后再加1或减1 “-变量名”或“+变量名”的形式 先加1或减1再执行表达式,33/68,加1运算符和减1运算符,示例(进阶),Example1: int i = 3 ; int k; k = +i + +i; printf(“i=%d k=%d“,i,k);,Example2: int i = 3 , j = 4; int k; k = +i + +i + +i ; printf(“i=%d
10、k=%d“,i,k);,),(,),(,34/68,加1运算符和减1运算符,良好的程序设计风格 在一行语句中,一个变量最好只出现一次增1或者减1运算 过多的增1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果,35/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏定义与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,36/68,宏常量与 const常量,看一个程序,37/68,宏定义与 const常量,幻数(magic number) 在程序中直接使用的常数称为幻数 使用幻数的缺点 程序的可读性变差 容易发
11、生书写错误 程序修改工作量大 解决方案 避免使用幻数,将其定义为常量,38/68,常量(constant) 在程序中不能改变其值的量 整型(如0,67, -2, 123L, 123u, 022, 0x12) 正整数,负整数,0 实型(如 2.3, 1.2e-5, 2.73F, 2.73L) 字符型(如 z, 3, $, n ) 用单引号括起来的字符 用”开头的字符为“转义字符”, 代表1个字符,宏常量与 const常量,39/68,常量(constant) 字符串(如 “UKM“, “1“, “5a“ ) 用一对双引号括起来的任意字符 枚举型,宏常量与 const常量,40/68,宏定义与 c
12、onst常量,const常量 使用const修饰的常量 只能在定义时赋值 const double PI=3.1415926; 程序运行过程中不允许修改其值 具有数据类型,编译器可以进行类型检查,41/68,宏定义与 const常量,const常量,42/68,宏定义与 const常量,宏(macro) 在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。 在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,称为“宏代换”或“宏展开” 宏代换是由预处理程序自动完成的。分为有参数和无参数两种,43/68,宏定义与 const常量,宏(macro) 无参宏定义由宏定义
13、编译预处理命令来进行定义 #define 标识符 字符串“#”表示这是一条预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。,#define PI 3.1415926,44/68,宏定义与 const常量,宏替换 使用宏定义后,编译器会将程序中所有该标识符的地方替换为宏定义中的字符串 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令,#undef PI,45/68,宏定义与 const常量,宏替换,#define PI 3.1415926int main() double circum,
14、area,r = 3.0;circum = 2 * PI * r;area = PI * r * r;printf(“circum = %fn“,circum);printf(“area = %f“,area);return 0; ,46/68,宏定义与 const常量,宏替换 变量或函数的某部分包含宏定义字符时,不发生替换下面的宏被替换成什么?,#define PI 3.1415 float PI_PI; PI_PI = PI * PI * 4;,3.1415 * 3.1415 * 4;,47/68,宏定义与 const常量,宏替换 只是一种简单替换,不进行任何语法检查下面的宏被替换成什么?
15、,#define PI 3.1415926; float PI_PI; PI_PI = PI * 4;,3.1415926; * 4;,48/68,宏定义与 const常量,宏替换 如果被定义的字符串为表达式,最好加括号 下面的宏被替换成什么?,#define SUM 2+3 A = SUM * 4;,#define SUM (2+3) A = SUM * 4;,A= 2+3 *4,A= (2+3) *4,49/68,宏定义与 const常量,带参宏定义 C语言允许宏带有参数。其定义形式 #define 宏名(形参表) 字符串调用形式 宏名(实参表),#define M(y) y*y+3*y,
16、K = M(5);,K = 5*5 + 3*5,50/68,宏定义与 const常量,带参宏定义 看一个带括号的例子,#define M(y) y*y+3*y K = M(5+1)*2,K = 5+1*5+1+3*5+1*2,#define M(y) (y)*(y)+3*(y),K = (5+1)*(5+1)+ 3*(5+1)*2,51/68,宏定义与 const常量,带参宏定义,#define MAX(a,b) (ab)?a:b int main(void) int x,y,max;printf(“input two numbers: “);scanf(“%d%d“, ,52/68,宏定义与
17、 const常量,注意事项 带参宏定义中,宏名和形参表之间不能有空格在宏定义中的形参是标识符,而宏调用中的实参可以是表达式 在宏定义中,字符串内的形参通常要用括号括起来以避免出错,#define M (y) y*y+3*y,53/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,54/68,自动类型转换,类型提升(type promotion) 当表达式中的操作数的类型不相同时,C编译器在运算之前,先将所有操作数转换成占内存字节数最大的操作数的类型,double,float,long,unsigne
18、d,int,char,short,55/68,自动类型转换,自动类型转换实例,Example:int number;float total, average;average = total / number;,15.000000 / 2.000000,7.500000,2.000000,56/68,自动类型转换,赋值中的自动类型转换 若赋值运算左侧变量的类型与右侧表达式的类型不一致,则赋值时发生自动类型转换 转换规则:将右侧表达式的值的类型转换成左侧变量的类型 将取值范围小的类型转换为取值范围大的类型是安全的,反之是不安全的,可能会产生字节丢失的错误,57/68,自动类型转换,自动类型转换实例
19、,58/68,自动类型转换,自动类型转换实例,Example:int total, number;float average;average = total / number;,15 / 2,7,59/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,60/68,强制类型转换,强制类型转换 强转可以消除从大到小的转换警告 转换方法 (类型) 表达式;,int a; a = (int)7.300000 ;,a = 7,61/68,强制类型转换,强制类型转换的例子,Example:int total,
20、number;float average;average = (float)total / number;,15.000000 / 2,7.500000,62/68,强制类型转换,强制类型转换的例子,m/2 = 2 (float)(m/2) = 2.000000 (float)m/2 = 2.500000 m = 5,63/68,本章主要内容,算术运算符赋值运算符增1和减1运算符宏常量与 const常量表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数,64/68,常用的标准数学函数,65/68,常用的标准数学函数,C的标准数学函数库#include “#include”为C语言
21、的编译预处理命令,作用是将后面的.h头文件的内容包含到当前文件中来,66/68,常用的标准数学函数,area = sqrt(s * (s - a) * (s - b) * (s - c) area = sqrt(s(s-a)(s-b)(s-c) s = 0.5 * (a + b + c) s = 1.0/2 * (a + b + c) s = (a + b + c) / 2.0 s = (float)(a + b + c) / 2 s = 1/2 * (a + b + c) s = (float)(a + b + c) / 2),67/68,C语言的数据类型,课后作业 计算10以内的奇数的平方的累加和的平方根并打印,要求输出结果为整型,本章结束,