第二章 数据类型、运算符和表达式 §2.1 数据与数据类型 §2.2 常量、变量和标准函数 §2.3 基本运算符及其表达式 目 录 上一章 第二章 数据类型、运算符和表达式 §2.1 数据与数据类型 §2.2 常量、变量和标准函数 §2.3 基本运算符及其表达式 目 录 上一章 下一章 习题
2.1 数据类型 C语言的基本数据类型 实型: 包括单精度实型、双精度实型 float,double 2.1 数据类型 基本类型 构造类型 指针类型 空类型 自定义 是C语言数据类型的基本型,其值不可再分解为其他类型。 一种由单种或多种数据类型构造而成的数据类型。 数组 结构 共用体 枚举类型 一种特殊的 数据类型, 其值为某个 量的内存地 址。 一种无返回值函数的数据类型。 void 用新的类型名替代已有类型名使用。 用typedef 定义 C语言的基本数据类型 整型: 包括有、无符号的基本整型、短整型、长整型 实型: 包括单精度实型、双精度实型 float,double 字符型: 用于表示和存储ASCII字符。 char
2.2 常量、变量和标准函数 2.2.1 常量 2.2.2 变量 2.2.3 标准函数 目 录 第二章 下一节 习题
2.2.1 常量 常量 (Constants / Literals) 在程序执行期间其值保持不变的量 C语言有以下几种类型的常量: 整型常量 2.2.1 常量 常量 (Constants / Literals) 在程序执行期间其值保持不变的量 C语言有以下几种类型的常量: 整型常量 实型(浮点型)常量 字符常量 字符串常量 https://www.tutorialspoint.com/cprogramming/c_constants.htm
1. 整型常量 有三种形式: 十进制整数: 八进制整数: 由数字 0 开头 如: 11, -13 , 0 , 65535 , … √ × 八进制整数: 由数字 0 开头 十六进制整数: 由前缀 0x 或 0X 开头 如: 11, -13 , 0 , 65535 , … √ 1,000 21/3 104 54. 10*3 01 9 9 × 如: 014 -011 0177777 如: 0x11 0XAFBDE √ 0X00FFH ×
整数又可分为: 长整型整数: 用后缀 L/l 表示。 012L , 65536L , 0XCL 无符号整数: 用后缀 U/u 表示。 017u, 0xfdbU 无符号长整数: 用后缀 UL/ul 表示。 15uL
2. 实型常量——浮点数 实型常量又称实数, 指带有小数部分的数。C语言中的实数 是以十进制表示的, 有两种表示形式: 十进制小数形式: 由数字、数符和小数点组成。 例: 0.123, .123, 123. ,0.0 , -2.5,… 指数形式: 又称科学记数法。用E(或e)表示以10为底的指数。 如: 100000000→ 1×108 →1E+8 0.0000125 → 1.25×10-5 →1.25E-05 0.91×10-3 → 0.91E-03 尾数部分 指数部分 字母E/e前必须有数字, 而E后面的阶码必须为整数。
例: 下列不合法的指数形式: ①单独的小数点和单独的指数部分 如: . E-5 E10 ②阶码只能是整数,不能带小数点。 如: 1234E1.5 2.E 6.5e (2*3)E-3 5*E4 ③1012不能写成 E12,必须写成: 1E12 1.0E12
3. 字符常量 字符常量: 是用单引号括起来的一个字符 如: ‘a’, ‘A’, ‘9’, ‘+’, ‘?’, ‘ ’ 合法 字符常量: 是用单引号括起来的一个字符 如: ‘a’, ‘A’, ‘9’, ‘+’, ‘?’, ‘ ’ 合法 “a”, ‘99999’, ‘’ 非法 在内存中, 字符常量以ASCI I码存储, 一个字符占一个字节。 由于字符常量是按整数存储的, 可以像整数一样在程序中参与相关的运算。如: ‘ a ’-3 2 ; // 执行结果9 7- 32 = 65 ‘ 9 ’-9; // 执行结果5 7- 9 = 48
转义字符 以“\”开头的字符序列, 有特定的含义。 如: ‘\\’ 表示输出一个反斜杠符 ‘\”’ 表示输出一个双引号 以“\”开头的字符序列, 有特定的含义。 如: ‘\\’ 表示输出一个反斜杠符 ‘\”’ 表示输出一个双引号 \ddd (ddd表示八进制的ASCII码) \xhh (hh表示十六进制的ASCII码) 例: ‘\n’ (回车换行) → ‘\12’ → ‘\xa’ ‘A’ → ‘\101’ → ‘\x41’ 注: ‘\0’或‘\000’是代表ASCII码为0的字符,即空字符(NULL), 表示整数0。
“CHINA”, “a”, “$12.5”, “”, “w\x53\\\np\103q” 4. 字符串常量 字符串常量: 用一对双引号括起的字符序列。例: “CHINA”, “a”, “$12.5”, “”, “w\x53\\\np\103q” 字符串长度: 字符串中所有字符的个数 系统自动在每个字符串的末尾加上一个空字符NULL, 即’\0’ 作为字符串的结束。’\0’是一个ASCII码为0的字 符。 例: “CHINA”在内存中所占的字节为:
字符串常量和字符常量的主要区别: 字符常量由单引号括起来, 字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量可以含有多个字符。 字符常量占一个字节, 字符串常量占的字节数等于字符个数加1。 比较: ’A’与”A”的区别 ‘A’ A 占一个字节 “A” 占两个字节 \0
5. 符号常量 符号常量: 用标识符表示的常量 格式: #define 标识符 常量 功能: 用该标识符代表后面的常量值 5. 符号常量 符号常量: 用标识符表示的常量 格式: #define 标识符 常量 功能: 用该标识符代表后面的常量值 例: #define PI 3.1415926 #define STAR ‘*’ 预处理命令#define也称为宏定义, 一个#define命令只能定义一个符号常量, 用一行书写, 不用分号结尾。
【例2.2】求半径为r的圆面积和圆周长 #include <stdio.h> #define PI 3.1415926 //用预处理命令定义符号常量 int main() { float r, area, l; //定义变量类型为实型 scanf("%f", &r); //输入r的值 area = PI * r * r; l = 2 * PI * r; printf("area=%f\nl=%f\n", area, l); return 0; }
5. 符号常量 说明: 符号常量名习惯用大写字母表示 该命令通常放在文件头 在程序中, 符号常量不允许重新赋值。 例: #define PI 3.1415926 PI=5.6; × 或 scanf( “%f ”, &PI ); ×
使用const定义常量 const type variable = value; #include <stdio.h> int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = '\n'; int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }
2.2.2 变量 变量概述 整型变量 实型变量 字符型变量 变量的初始化
变量概述 变量: 在程序执行期间其值可以改变的量 变量在使用之前必须被声明 每一个变量有名字,类型,长度和值。 对变量赋值过程是“覆盖”过程,用新值去替换旧值。 从内存中读出变量的值,该变量保持不变。 int x =23; 23 0000FF02 4Bytes RAM x = 90; 声明的作用 为变量分配内存单元,变量名作为内存单元的符号地址,这件事是在程序编译链接时完成的。 变量赋值特点 (1)先定义,后使用 int d,e,f; 定义三个变量为整数类型 如未定义,则在编译时被查出,认为非法 (2)变量未被赋值前,值为0 (3)对变量赋值过程是“覆盖”过程,用新值去替换旧值 (4)读出变量的值,该变量保持不变 (5)参与表达式运算的所有变量都保持原来的值不变 90 printf(“%d”, x);
变量概述 定义变量的形式: 类型说明符 变量名表; 例: int a, b; /*定义两个整型变量a和b*/ 类型说明符 变量名表; 例: int a, b; /*定义两个整型变量a和b*/ char c; /*定义字符型变量c*/ float f1, f2; //定义单精度实型变量f1和f2 变量类型(type) 变量名(name)是一个标识符
1. 整型变量 ─用来存放整型数据的变量 整型变量的分类表 类型名称 类型说明符 字节数 数值范围 基本整型 int >=2 -32768~32767 短整型 short [int] 长整型 long [int] >=4 -2147483648~ 2147483647 无符号基本整型 unsigned [int] 0~65535 无符号短整型 unsigned short [int] 无符号长整型 unsigned long [int] 0~4294967295 与操作系统、编译系统、机器字长有关。
有符号的整数 ─ 最高位是符号位 正整数在内存中以二进制原码形式存放。 负整数在内存中以二进制补码的形式存放。 有符号正整数 10 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 有符号负整数 -10 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 符号位 00000000 00001010 RAM -10的原码 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 按位取反 加1后得到-10的补码 符号位 11111111 11110110 RAM
无符号整数的所有二进制位全部用来存放数值, 不能存放负数。 无符号整数 无符号整数的所有二进制位全部用来存放数值, 不能存放负数。 无符号整数 65535u 1 1 1 1 1 1 1 1 11111111 RAM
例: 求50的三次方 #include <stdio.h> void main( ) { short int x; x=50*50*50; printf(“%d\n”, x ); } 程序运行结果为: -6072 (错)
将以上程序改为: #include <stdio.h> void main( ) { int x ; x=50*50*50 ; printf(“%d\n”, x) ; } 运行结果:125000 因此,在定义整型变量时,要注意数据类型允许的 数值范围。
2. 实型变量 用来存放实型数据的变量 分单精度型、双精度型和长双精度型三类
【例2.3】实型变量的使用 d=33333333333333.332000 #include <stdio.h> void main( ) { float f ; // f为单精度实型变量 double d ; // d为双精度实型变量 f=33333.33333 ; d=33333333333333.333333; printf(“f=%f\nd=%f\n”, f, d); } 输出结果: f=33333. 332031 d=33333333333333.332000 f; 无 效 数 字
每个字符变量分配一个字节用于存放一个字符。 (存放的是字符的ASCII码值) 3. 字符变量 ‘A’的ASCII码(值)为65 ‘\n’的ASCII码(值)为10 0 1 0 0 0 0 0 1 0 0 0 01 0 1 0 c1 c2 用来存放字符常量的变量 例: char c1, c2, c3 ; c1=‘A’; c2=‘\n’; c3=97; 每个字符变量分配一个字节用于存放一个字符。 (存放的是字符的ASCII码值) 字符数据与整型数据可相互赋值,直接运算。 可以把字符变量按整型量输出, 也允许把整型量按字符量输出。
{ int a=‘b’; //给一个整型变量赋一个字符值 char c1=97; //给一个字符变量赋一个整数值 【例2.4】字符型变量的使用 #include <stdio.h> void main( ) { int a=‘b’; //给一个整型变量赋一个字符值 char c1=97; //给一个字符变量赋一个整数值 c1=c1-32; // 将小写字母转换为大写字母 printf(“%d %d\n”, a , c1); printf(“%c %c\n”, a , c1); } 字符存放在内存中是以ASCII码的形式存放的,因此,用赋值语句 c1 = ‘A’; c1 = 65; 两者是等效的,在内存中存的都是65。 可以做实验,如下例所示 // 例 s2_2.c #include <math.h> // 包含头文件 void main( ) // 主函数 { char thisman; // 声明字符变量 thisman=‘A’; // thisman 赋值为’A’ printf(“thisman=%c\n”,thisman); // 输出thisman的值 printf(“ 65==‘A’ ----取值为%d\n”,65==‘A’); // 验证 // 65是否等于‘A’,并输出结果 编译链接后运行,输出结果为: thisman=A 65==‘A’----取值为1 输出结果: 98 65 b A
注意: 只能将一个字符常数赋给一个字符变量, 不能 把一个字符串常量赋予字符变量。 例: char c=“abc” ; 只能将一个字符常数赋给一个字符变量, 不能 把一个字符串常量赋予字符变量。 例: char c=“abc” ; 在C语言中没有字符串变量 (但可以用一个字符数组来存放一个字符串常量) ×
4. 变量的初始化 在说明变量的同时给变量赋初值 格式: 类型说明符 变量 = 常数 ; 例: int a=5; //定义并初始化 类型说明符 变量 = 常数 ; 例: int a=5; //定义并初始化 char c1=‘a’, c2=‘B’ ; double area, r=23.e-2 ; int x=10, y=10, z=10 ; //不能写成int x=y=z=10;
2.2.3 标准函数 包括: 输入输出函数、数学函数、字符和字符串函数等。 数学函数(math.h) sin(x) C编译系统提供的库函数 包括: 输入输出函数、数学函数、字符和字符串函数等。 数学函数(math.h) sin(x) cos(x) exp(x) log(x) log10(x) fabs(x) pow(x, y) sqrt(x) x为弧度, double x, double sin(x) cos(x)
area=√s(s-a)(s-b)(s-c) , s=(a+b+c)/2 【例2.5】求三角形面积 area=√s(s-a)(s-b)(s-c) , s=(a+b+c)/2 #include <stdio.h> #include <math.h> //预编译命令, 将系统提供的数学函数 //作为头文件包含到用户源文件中 void main( ) { double a, b, c, s, area; scanf(“%lf,%lf,%lf”, &a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“the area is%6.2f\n”, area); } 运行
2.3 运算符和表达式 算术运算符 赋值运算符 逗号运算符 基本运算符 逻辑运算符 条件运算符 求字节运算符 位逻辑运算符 C运算符 位移动运算符 位自反运算符 强制类型转换运算符 指针运算符 下标运算符 分量运算符 基本运算符 位运算符 特殊运算符 C运算符 本节 介绍
2.3 基本运算符及其表达式 2.3.1 算术运算符与算术表达式 2.3.2 不同数据类型的转换与运算 2.3.3 关系运算符与关系表达式 2.3.1 算术运算符与算术表达式 2.3.2 不同数据类型的转换与运算 2.3.3 关系运算符与关系表达式 2.3.4 逻辑运算符与逻辑表达式 2.3.5 条件运算符与条件表达式 2.3.6 赋值运算符与赋值表达式 2.3.7 逗号运算符与逗号表达式
1. 基本算术运算符 算术运算符用于各类数值运算。包括基本算术运算符、自增运算符、自减运算符。下表为基本算术运算符。 1
在C语言中,规定了运算符的优先级和结合性。 优先级: C语言中,运算符的优先级共分为15级。1级最高, 15级最 低。表达式求值时, 先做优先级高的操作。 如: d=a+b*c ; 当运算符的优先级别相同时,运算次序由结合性决定。 结合性: 左结合性(先左后右)例: d=3*5/4; 右结合性(先右后左)例: d=a=3;
/运算符 ① 整数相除截去余数, 此运算为整除。 5/2=2 (≠2.5) 1/3+1/3+1/3=0 ② 对于浮点数则为通常意义的除法 5.0/2.0=2.5 1./3+1./3+1./3=1
% 模运算符 用于计算两个数相除后得到的余数。 如: a%b 求a除以b以后得到的余数。 运算对象只能是整型量, 其结果也是整型量。 如: 5%2=1 3%3=0 3%5=3 ‘A’%2=1 3.0+10.0%5 所得结果的符号与运算符左侧操作数的符号相同 × -5%2=-1 5%-2=1
2. 自增、自减运算符 例: x = 10 ; y = ++x ; 此时, y = 11 含义 运算符 优先级 结合性 功能 自增 ++ 2 右结合 使变量的值增1 自减 -- 使变量的值减1 使用形式 ++i 或--i 变量i先自增或自减1,再引用i。 i++或i-- 先使用变量i,再自增或自减1。 例: x = 10 ; y = ++x ; 此时, y = 11 若: x = 10 ; y = x++ ; 则 y = 10 在这两种情况下, x都被置为11。
例: K=3; j=5; i=3; m=(++k)*j ; n=(i++)*j ; m= k= 20 4 n= i= 15 4
【例2.7】自增、自减运算符的使用。 i = ? 7 7 -6 i = 7 #include <stdio.h> int main() { int i = 6, a, b; printf("% d\n", ++i); printf("% d\n", i++); a = --i; printf("% d\n", a); b = i--; printf("% d\n", b); printf("% d\n", -i++); printf("i = %d\n", i); return 0; } 7 -6 i = 7 i = ? 7
注意: 自增、自减运算只能用于变量, 不能用于常量和表达式。 例: i++ 为合法的运算 ++6, ++(a+b) 为非法的运算 自增、自减运算符是两个+或两个-的一个整体, 中间不能 有空格。如果有多于两个+ 或两个-连写的情况,则编译 首先识别前两个+或-为增量或减量运算符。 表达式 x+++y 等价于 (x++)+y 自增、自减运算符的运算顺序是右结合,因此对-i++应理解为: -(i++),而 (-i )++ 是非法的。 例: i=3 ; printf(“%d”, -i++); 输出: -3
【例2.8】自增、自减运算符的使用 #include <stdio.h> int main() { int i, j, k; k = i++ + j; printf(“i = % d, j = % d, k = % d\n”, i, j, k); return 0; } 程序运行结果: i=2, j=1, k=2 k=(i++)+j;
3. 算术表达式 由算术运算符和括号将运算对象(如常量、变量、函数等)连接起来的一个有值的式子。 例: ‘A’*2-sqrt(4.)/-d (d=2) 表达式求值的优先次序: () 函数 - (负数) *、/、% +、- 高 低
书写问题: ① “/”号,如: → (a+b)/(c+d) ② “*”不能省略,如: 2(a+b) →2*(a+b) ③括号只能使用圆括号, 且成对出现,不能使用[ ] 和{ }。 如: a[x+b(y+c)] → a*(x+b*(y+c))
例: 将下列数学式子写成C算术表达式 ⑴ LN( -X) → log( sqrt( a+x*x )-x ) ⑵ │a│e-st → abs(a)*exp(-s*t ) ⑶ → sqrt(fabs(sin(x*3.14/180))) ⑷ xy → pow(x, y)
例: 与数学式子3乘以x的n次方除以(2x-1)对应的C语言表达式是____。 A> 3*x^n/(2*x-1) B> 3*x**n/(2*x-1) C> 3*pow(x,n ) *(1/(2*x-1) ) D> 3*pow(n, x) /(2*x-1) √
2.3.2 不同数据类型间的转换与运算 在C程序中, 当不同类型的量进行运算时, 要转换成同一种类型然后再进行运算。 例: 10+‘a’+1.5-8765.1234*‘b’ 转换方式: 自动转换:数据类型自动由低级向高级转换。 强制转换: 将表达式的运算结果强制转换成指定的数据类型。
自动类型转换 这种类型转换由编译系统自动完成 转换规则: float double long unsigned int char short 低 高 例: float f=3.5; int n=6; long k=21; double ss=f*n+k/2; 说明: 1. 横向的箭头表示必定的转换。 2. 纵向的箭头表示当运算对象 类型不同时转换的方向。
强制类型转换 格式: (数据类型说明符)(表达式) 注意: 强制转换属单目运算, 运算优先级为2。 强制转换得到的是中间结果类型,原变量类型不变。 数据类型说明符和表达式都必须加括号(单个变量除外) 例: int x, y ; float z ; (float)(x+y) ; (int)z+x ; (float)(5%3); (将5%3的值转换为float型)
#include <stdio.h> int main() { int x = 8; float f = 6.85; 【例2.12】强制类型转换的应用 (float)x=8.000000, x=8 (int)f=6, f=6.850000 X, f的类型并未改变 #include <stdio.h> int main() { int x = 8; float f = 6.85; printf("(float)x=%f, x=%d\n", (float)x, x); printf("(int)f=%d, f=%f\n", (int)f, f); return 0; } 2,
2.3.3 关系运算(比较运算) 即比较两个量的大小, 比较的结果为“真”或“假”。 例: a >3 如果a=8,则结果为“真”;如果a=1,则结果为“假”。 1. 关系运算符 含义 运算符 优先级 结合性 小于 < 6 左结合 小于等于 <= 大于 > 大于等于 >= 等于 == 7 不等于 !=
2. 关系表达式 用关系运算符将两个表达式连接起来的式子。 格式: <表达式1> <关系运算符> <表达式2> 其中: 表达式1和表达式2可以是任意表达式。 例: 5>(4<5) ‘a’> ‘b’+3 (a=4)>=(b=6) 5>2>7>8 值为: 1 例: m+n<=20, 测试此关系是否成立, 成立为真,不成立为假。 成 立 —— 关系表达式的值为1; 不成立 —— 关系表达式的值为0。 关系表达式的值是一个逻辑值: “真”或“假” C语言没有逻辑型数据, 因此, 用1表示“真”, 用0表示“假” 。 判断时, 0代表“假”, 非0即表示“真” 。
#include <stdio.h> int main() { int a, b, c; a = b = c = 10; 例2.13读程 输出结果: 1 , 10 , 10 1 , 20 , 11 0 , 20 , 11 #include <stdio.h> int main() { int a, b, c; a = b = c = 10; a = b == c; printf("%d , %d , %d \n", a, b, c); a == (b = c++ * 2); a = b > c >= 100; return 0; }
关系运算的不足 则不能用关系表达式表示。 关系表达式只能表达简单的关系,如: sum>=1500 即只能对一个条件进行测试。 y!=z 即只能对一个条件进行测试。 而以下关系: 0<x<5 则不能用关系表达式表示。 x>0&&x<5
2.3.4 逻辑运算符与逻辑表达式 1. 逻辑运算符 C逻辑运算符 含义 运算符 优先级 结合性 逻辑非 ! 2 右结合 逻辑与 && 11 左结合 逻辑或 || 12
逻辑运算真值表 逻辑非! 逻辑与&& a !a 1 逻辑或‖ a b a&&b 1 a b a||b 1 特点: 全真为真, 其余为假。 逻辑或‖ a b a&&b 1 a b a||b 1 特点: 全真为真, 其余为假。 特点: 全假为假, 其余为真。
[<表达式1>] <逻辑运算符> <表达式2> 表达式1和表达式2可以是任何表达式 2. 逻辑表达式 用逻辑运算符将表达式连接起来的式子。 形式: [<表达式1>] <逻辑运算符> <表达式2> 表达式1和表达式2可以是任何表达式 如: 5>3&&2||4-!'a' 逻辑表达式的值 整数 1: true 0: false 判断时, 0代表“假”, 非0即表示“真” 。
将下面的条件用C语言的逻辑表达式表示 例1: 1≤x≤10且x≠7 x>=1 && x<=10 && x!=7 例2: y能被4整除, 但不能被100整除或y能被400整除。 y%4==0 &&y%100!=0||y%400==0
运算顺序: ( )→!→算术运算→关系运算→&&→||→赋值运算 例: 若 a=2, b=‘a’, c=5, f=3.0 c>3&&8<4-!0 f/3&&a-b !( b-‘a’ ) (a=7)>6&&(b=-1)>6 1 1
逻辑与和逻辑或运算符具有短路能力 逻辑与: (表达式1) && (表达式2) && … 只有表达式1的值为“真”时才求表达式2的值 如: x=y=-1; ++x &&++y; /* x=? y=? */ -1
printf(“num=%d\n”, num); } 短路表达式 逻辑或: (表达式1) || (表达式2) ||… 只有表达式1为假时才判断表达式2的值 例: void main( ) { int num=3; 5>4||(num=0); printf(“num=%d\n”, num); } 输出: num=3
2.3.5 条件运算符与条件表达式 条件运算符: ? : 三目运算符、右结合、13级。 条件表达式: 条件运算符: ? : 三目运算符、右结合、13级。 条件表达式: <表达式1> ? <表达式2> : <表达式3> 执行过程: 例: max=(a>b) ? a∶b; max= a>b ? a∶b ;
说明: 在程序中常把条件表达式的值赋给某个变量, 如: ①将ch中字母转换为小写字母 char ch=getchar( ); 在程序中常把条件表达式的值赋给某个变量, 如: ①将ch中字母转换为小写字母 char ch=getchar( ); ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32): ch ; ②将x 的绝对值赋给 y y= x>=0 ? x : -x ;
说明: 在条件表达式中, 各表达式的类型可以不同, 此时, 条件表达式值的类型为表达式2和表达式3中较高 的类型。 如: 在条件表达式中, 各表达式的类型可以不同, 此时, 条件表达式值的类型为表达式2和表达式3中较高 的类型。 如: x>y ?1∶1.5 条件表达式的值为浮点型
说明: 条件运算符可以嵌套, 这种嵌套是右结合的。 例: int a=15, b=20, c=25, d=30, e ; 条件运算符可以嵌套, 这种嵌套是右结合的。 例: int a=15, b=20, c=25, d=30, e ; e= a>b ? c : c>d ? b : d ; ( ) e=30
#include<stdio.h> void main( ) { int a=1, b=1, c=1; 例2.15 读程, 写出运行结果。 运行结果: (1)2 (2)3 b (4)2, 2, 4 #include<stdio.h> void main( ) { int a=1, b=1, c=1; a = a+b ; b=b+c ; c = c+a ; printf(“(1)%d\n”, a>b ? a : b ); printf(“(2)%d\n”, a>c ? a-- : c++); (a>=b>=c) ? printf(“a\n”) : printf(“b\n”); printf(“(4)%d, %d, %d\n”, a, b, c ); }
#include<stdio.h> void main( ) { int a,b,c,max ; 例2.16:任意输入三个数,输出最大值。 #include<stdio.h> void main( ) { int a,b,c,max ; scanf(“%d%d%d”, &a, &b, &c); max= a>=b ? a>=c ? a : c : b>=c ? b : c ; printf(“最大数为: %d\n”,max) ; } ( ) ( ) 程序运行如下: 25 -7 48↙ 最大数为: 48
2.3.6 赋值运算符和赋值表达式 赋值运算符分两种: 简单赋值运算符: = 复合赋值运算符: 如 +=、-=、*=、/=、%= 等 复合赋值运算符: 如 +=、-=、*=、/=、%= 等 优先级14,右结合性。 赋值表达式: 由赋值运算符连接起来式子 作用: 将表达式的值赋给变量
1. 简单赋值运算符和赋值表达式 简单赋值运算符为“=” ; 由“=”连接的式子为 (简单) 赋值表达式。 1. 简单赋值运算符和赋值表达式 简单赋值运算符为“=” ; 由“=”连接的式子为 (简单) 赋值表达式。 格式: <变量> = <表达式> 作用: 把右边表达式的值,赋给左边的变量。 例: k=i+++--j (i=2, j=3, k的值为 ) x=(a=5)+(b=8) (x的值为 ) d=e=2.1 执行顺序是: 先计算,再赋值。 4 13
⑸ cos(β)=a/sqrt(a*a+b*b) ⑹ y=int(i) ⑺ k=12.3%4 ⑻ a=a+7; 例: 指出下列赋值表达式的错误 ⑴ -s=x+y ⑵ 5=n ⑶ a=a*3=2 ⑷ w=3.64E2.1/5.87 ⑸ cos(β)=a/sqrt(a*a+b*b) ⑹ y=int(i) ⑺ k=12.3%4 ⑻ a=a+7;
赋值运算的类型转换, 规则为: 实型数据赋给整型变量时,只取整数部分。 如: int i=1.5*2/2 ; ( i值为1 ) 赋值运算的类型转换, 规则为: 实型数据赋给整型变量时,只取整数部分。 如: int i=1.5*2/2 ; ( i值为1 ) 整型数据赋给实型变量时,以浮点形式取值。 如: float x=1/4+1/4+1/4 ; ( x的值为0.000000 ) 字符型数据赋给整型变量时, 整型变量的高位补的数与 char的最高位相同, 低八位为字符的ASCII码值。 k: 0000 0000 0100 0001 如: K=‘A’ (k值为65) 整型数据赋给字符型时,只把低8位赋给字符变量。
2. 复合赋值符及表达式 复合赋值运算符是在简单赋值运算符前加双目运算符构成。 共10种: +=, -= *=、/=、%= 等。 例: c=c+3 c += 3 x*=y+7 x=x*(y+7) 设x, y, z的初始值分别为: 10, 20, 30 x+=y+=z*z x=x+(y=y+z*z) 结果为: 930 设 t 的值为5 t+=t-= t*t t=t+(t=t-t*t) 结果为: -40
例2-14 void main( ) { int a, b, c; a=b=c=5; 运行结果: a=5, b=5, c=5 a=10, b=4, c=6 a=20, b=4, c=6 a=0 void main( ) { int a, b, c; a=b=c=5; printf(”a=%d, b=%d, c=%d\n”, a,b,c); a=(b=4)+(c=6) ; a+=b+c ; a+=a-=a*=a ; printf(”a=%d\n”,a) ; }
2.3.7 逗号运算符和逗号表达式 <表达式1> , <表达式2> , … , <表达式n> 逗号运算符运算符: “ , ” 优先级15级 最低,左结合 用逗号运算符将各表达式连接起来的式子为逗号表达式。 格式: 如: a=3*5, a*10, a+8 求解过程: 先求表达式1的值, 再求表达式2的值, 最后求 表达式n的值, 表达式n的值作为整个逗号表达式的值。 <表达式1> , <表达式2> , … , <表达式n>
#include<stdio.h> void main( ) { int a=2, b=4, c, y; 例: 逗号表达式的应用 #include<stdio.h> void main( ) { int a=2, b=4, c, y; y=(c=a*b , b+c) ; printf(“y=%d\n”, y ); } 输出结果: y=12
例: 1) (a=3*5, a*4), a+5 2) a=5, a*=a , a+5 3) int a, b; a=2, b=5, a++, b++, a+b; 4) int x=10, y=3, z; printf(“%d\n”, z=(x%y, x/y)); 20 30 9 3
说明: (1) 用一个逗号表达式语句,可代替多个赋值语句, 如 a=0; b=1; c=2; 可写成: a=0, b=1, c=2 ; (2) 在变量说明和函数参数表中逗号只是起分隔符作用 printf(“%d,%d,%d” , a , b ,c ); printf(“%d,%d,%d” , (a, b, c) , b ,c);
例: 交换变量a, b的值。 a=1.0, b=2.0 void main( ) ② { float a, b, c; a=1.0; printf(“a=%f b=%f”,a,b); c=a; a=b; b=c; printf(“a=%f b=%f”, a,b); } a 2.0 1.0 2.0 1.0 b ① ③ 1.0 c a 1.0 2.0 b x y a b
上机作业: 1. 取圆周率为3.1415926, 半径r为40, 求圆面积。 要求: ① 圆周率定义为符号常量 ② 半径用scanf( )输入 ③ 分两行输出, 先输出圆周率和半径, 再输出面积。 2. 输入两个数分别赋予整型变量a, b。然后, 交换变量 a, b 的值再输出。
上机作业: ⑵ 编程: 输入一个三位正整数,然后反向输出对应的数。如输入123,则输出321。 要求: 用 / % 运算符