79
二二二二二 二二二二 二二二 、、、 二二二二二二二二二 C 二二二二二二二二二二• char 二二二二 () • int 二二二 () • float 二二二二二二二 () • double 二二二二二二 () 2.1 二二 二二 二二二二二二二二二二二二二二二二二二 :。 • 二二二二 二二二二二 二二二二二 二二二二二 :、、、 二二二二二 二二二二

二、数据类型、运算符、表达式 和常用输入输出函数

Embed Size (px)

DESCRIPTION

二、数据类型、运算符、表达式 和常用输入输出函数. C 语言的基本数据类型有: • char (字符型) • int (整型) • float (实型或浮点型) • double (双精度实型) 2.1 常量 • 常量:程序运行过程中其值不能被改变的量称。 • 常量 分为:整型常量、实型常量、字符常量、 字符串常量、符号常量. 2.1.1 整型常量. 整型常量即整常数 1 . 整数 • 取值范围:一般占一个机器字,如字长两字节, 则为 -32768 ~ +32767 • 表示形式: - PowerPoint PPT Presentation

Citation preview

Page 1: 二、数据类型、运算符、表达式 和常用输入输出函数

二、数据类型、运算符、表达式和常用输入输出函数

C 语言的基本数据类型有: • char (字符型) • int (整型) • float (实型或浮点型) • double (双精度实型)2.1 常量 • 常量:程序运行过程中其值不能被改变的量称。 • 常量分为:整型常量、实型常量、字符常量、 字符串常量、符号常量

Page 2: 二、数据类型、运算符、表达式 和常用输入输出函数

2.1.1 整型常量 整型常量即整常数1. 整数 • 取值范围:一般占一个机器字,如字长两字节, 则为 -32768 ~ +32767 • 表示形式: 十进制整数 以非 0 开头的整数 八进制整数 以 0 开头的整数 十六进制整数 以 0x 或 0X 开头的整数 例: -123 、 456 、 0123 、 -0x123

Page 3: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 长整数  • 取值范围:占四字节  - 2147483648 ~ +2147483647 • 表示形式:在整数后面加字母 L 或 l 例: 456l 、 -0456l 、 0x456l

Page 4: 二、数据类型、运算符、表达式 和常用输入输出函数

2.1.2 实型常量1. 实型常量又称浮点数常量,只使用十进制,有两种表示形式: • 定点数形式 由正负号、整数部分、小数点、小数部分组成 例: 0.0 、 12.34 、 0.123 、 .123 、 -123.0 、 -123. • 指数形式  由正负号、整数部分、小数点、小数部分、 E(e) 后带或不带正负号的整数组成 合法: 1e-5 、 -3.14157E+7 、 -28e-005 、 123.45E0 非法: E8 、 3E-5.6 、 .e2 、 4e 、 e2. 实型常量不分单、双精度 , 都按双精度 double 型处

Page 5: 二、数据类型、运算符、表达式 和常用输入输出函数

2.1.3 字符常量1. 字符常量是用一对单引号(作为定界符)括起来的 一个字符。 'A', 'a', '5', '?', '+', '!', '$' 。 字符不能是单引号 ' 、双引号 " 、反斜杠 \ 。2. 字符常量具有数值,即其 ASCII 代码值。 C = 'A'; 与 C = 65; 等价。3. 转义字符 一对单引号括起来,里面是 反斜线开头,后跟一个字符,如 '\n' 。或 反斜线开头,后跟一个一到三位八进制数,或 后跟一个一到二位 x 开头的十六 进制数。(表 2.2 )

Page 6: 二、数据类型、运算符、表达式 和常用输入输出函数

常用转义字符符号 ASCII

值功能

\ddd 8 进制数表示的 ASCII 字符\xhh 16 进制数表示的 ASCII 字符

\a 7 响铃\t 9 水平制表\n 10 换行\r 13 回车\b 8 退格\' 39 单引号\" 34 双引号\\ 92 反斜线\0 0 空字符

Page 7: 二、数据类型、运算符、表达式 和常用输入输出函数

2.1.4 字符串常量

1. 字符串常量一对双引号括起来的字符系列。 例: "hello!", "program", "a", "123.45"

2. 存储形式 字符串的每个字符占一个字节,在其尾部自动 追加一个字符 '\0' 。 h e l l o ! \0 104 101 108 108 111 33 0

Page 8: 二、数据类型、运算符、表达式 和常用输入输出函数

2.1.5 符号常量符号常量即用一个特定的符号来代表一个常量 • 定义: #define 符号常量 常量(字符串) 例: #define R 5.179 • 符号常量须“先定义,后使用”,一般用大写

字母 例: #define PRICE 35 #define NUM 10

#define SUM PRICE*NUM main ( ) { printf("total=%d\n", SUM); } 结果: total=350

Page 9: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2 变量 • 变量:程序运行过程中其值可以改变的量。 • 变量名和变量值:

变量名 (标识符) a

变量值 98

变量存储单元地址• 变量分为两类 普通变量:存放各种普通的数据 指针变量:存放地址

Page 10: 二、数据类型、运算符、表达式 和常用输入输出函数

• 变量须“先定义,后使用”,一般用小写字母• 普通变量定义的一般形式: 数据类型 变量名表; 例: int a; int a, b;

• 定义普通变量时可以对它初始化 例: int a = 3, b = 2;

Page 11: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2 变量

2.2.1 整型变量2.2.2 实型变量 2.2.3 字符变量2.2.4 指针变量

Page 12: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2.1 整型变量

数据类型所占位数 数 值 范 围

int 16 -32768~32767 (-215~ 215-1)

short [int] 16 -32768~32767 (-215~ 215-1)

long [int] 32-2147483648~2147483647(-231~ 231-1)

unsigned int 16 0 ~ 65535 ( 0 ~ 216-1 )unsigned short 16 0 ~ 65535 ( 0 ~ 216-1 )unsigned long 32 0 ~ 4294967295 ( 0 ~ 232-1)

Page 13: 二、数据类型、运算符、表达式 和常用输入输出函数

整型数据的溢出:• 例 1 : main() { int a,b; b=32767; a=b+1; printf("%d\n",a); }

32767 :0111111111111111

-32768 :1000000000000000

• 例 2 : main() { long a; int b=1; a=32767+b; printf("%d\n",a); }

Page 14: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2.2 实型变量数据类型 所占位数 数值范围 有效数字

float 32 10-37~ 1038 6~7

double 64 10-307~ 10308 15~16

long double 128 10-4931~ 104932 18~19

例: main() { float x,y; x=111111.111; y=222222.222; printf("%f\n",x+y); } 运行结果为 333333.328125

Page 15: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2.3 字符变量 • 说明字符变量使用 char 标识符 • 一个字符变量在内存中占一个字节 • 将一个字符常量赋值给一个字符变量,实际上 是把该字符的 ASCII 代码放到字符变量对应的 内存单元中去 • 字符数据与整型数据的存储形式相类似,可以 相互赋值或混合运算,一个字符数据既可以以 字符形式输出,也可以整数形式输出

Page 16: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : main() { char c1,c2; c1='a'; c2='b'; printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); }例 2 : main() { int c1 ; char c2; c1='a'; c2=98; printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); }

运行结果: a b

97 98

Page 17: 二、数据类型、运算符、表达式 和常用输入输出函数

2.2.4 指针变量

• 指针变量的内存单元中存放的是一个变量的地址

i j i j

变量 j 的地址赋给指针变量 i 指针变量 i 指向变量j

1000 1000

1000 1000

Page 18: 二、数据类型、运算符、表达式 和常用输入输出函数

• 可在定义变量的同时,定义相应类型的指针变量; 指针变量定义的一般形式: 数据类型 * 指针变量名; 例: int *p; /* 定义 p 是指向整型变量的指针变量 */

float *y; /* 定义 y 是指向实型变量的指针变量 */

char *s; /* 定义 s 是指向字符型变量的指针变量*/

• 定义指针变量时可以对它初始化 int i , *p = &i;

Page 19: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3 运算符

2.3.1 算术运算符2.3.2 关系运算符和逻辑运算符2.3.3 位运算符2.3.4 赋值运算符2.3.5 其他运算符

Page 20: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3.1 算术运算符1. 加、减、乘、除和取余运算符: + 、 - 、 * 、 / 、

%

• 除号 /

- 当两个整型数相除时,结果为整数(商的整数 部分) - 当被除数和除数只要有一个是实型数时,结果 为实数的商。 • 取余号 %

只能对整型数运算。

Page 21: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 自增、自减运算符: ++ 、 --

• 用法 - 前置运算: ++ 或 -- 用在变量之前,先将变量的 值增 1 或减 1 ,再将该变量的新值用于表达式中 - 后置运算: ++ 或 -- 用在变量之后,先将变量的 值用于表达式中,再将该变量的值增 1 或减 1

例: i=5+j--; i=5+--j;

• 只能用于变量,不能用于常量和表达式 合法: i++; --j; i=(j++)*5;

非法: 6--; i=(j*5)++;

Page 22: 二、数据类型、运算符、表达式 和常用输入输出函数

• 例: main() { int a=5,c;

c = ++ a; /* a 先增 1 ,再运算 */ c = c + a ++; /* a 先运算,再增 1 */ printf ("a = %d \tc = %d\n",a,c); } 结果: a = 7 c = 12

3. 取负运算符: -

4. 算术表达式 是用算术运算符和括号将运算对象(常量、变量 和函数等)连接起来的、符合 C 语法规则的式子。

Page 23: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3.2 关系运算符和逻辑运算符1. 关系运算符(比较运算符) 用于比较两个表达式值的大小,有 6 种: > 、 >= 、 < 、 <= 、 = = 、 !=

2. 关系表达式 • 是用关系运算符把两个表达式联系起来的式子 • 关系表达式成立,其值为真,用 1 代表;否则为假, 用 0 代表。 如 int a = 4, b = 8;

则 关系表达式 a > b 的值为 0 , 而 关系表达式 a < b 的值为 1 。

Page 24: 二、数据类型、运算符、表达式 和常用输入输出函数

这里的 0 和 1 是逻辑值,它可以作为判断的条件, 也可以和其它的关系表达式做逻辑运算(与、或、 非等),也可以和其它的算术表达式做算术运算 • 运用关系表达式时的注意事项 判断两个实数是否相等时,必须考虑到计算机运 算时可能产生的误差。 例如:关系表达式 (2.0/3.6*3.6)==2.0

对于表达式 (2.0/3.6*3.6) ,计算机运算的结果可 能是 2.000001 或 1.999999 ,因此,可把关系表达

式 写成: fabs(2.0-2.0/3.6*3.6)<1e-5

Page 25: 二、数据类型、运算符、表达式 和常用输入输出函数

关系表达式中字符型数据按其 ASCII 码值参加 比较运算 100 < 'a' 值为 0 '3' > 30 值为 1

运算符两边的表达式可以是算术、字符、赋值、 关系、或逻辑表达式。 例:( a+x)>(b+y)

(x=4)<=y++

关系运算符运算时结合方向自左至右。 例: 若 a = 4, b = 3, c = 2 则 x = ( a < b < c ) x 的值为 1 ; y = ( a > b > c ) y 的值为 0 。

Page 26: 二、数据类型、运算符、表达式 和常用输入输出函数

3. 逻辑运算符 用于对逻辑量进行运算,有 3 种: && 逻辑与 双目运算符 || 逻辑或 双目运算符 ! 逻辑非 单目运算符4. 逻辑表达式 • 是用逻辑运算符联系起来的表达式。如: a && b; a || b; ! a ;

• 逻辑运算符两边是逻辑值。非 0 为真, 0 为假。

• 逻辑表达式的值也是逻辑值。真为 1 ,假为 0 。

Page 27: 二、数据类型、运算符、表达式 和常用输入输出函数

• 运用逻辑表达式的注意事项 判断数值是否为真时,非 0 代表真, 0 代表假 逻辑运算符两侧的操作数不仅可以是整数,也 可以是其他数据类型,只要该类型的数据值最 终能得到 0 或非 0 值 逻辑表达式中,不一定对逻辑运算符两侧的表达 式都求值 (&& 、 ||)

数学上的数值区间不能直接用在 C 语言的判断条 件上 如数学上的 1<x≤10 ,不应写成: 1<x<=10 ; 而应写成: (1<x)&&(x<=10)

Page 28: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : int x, y, z, w;

x = y = z = -1;

w = (+ + x || + + y) && + + z;

printf ("%d, %d, %d, %d\n", x, y, z, w);

输出为何?

&& 前的操作数值若是假,则后面的表达式无需运算

|| 前的操作数值若是真,则后面的表达式无需运算

Page 29: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 :逻辑表达式 (!E) 的值等价于 _____ 。 A) E == 0 B) E != 1 C) E != 0 D)-E

! E E == 0 E != 1 E != 0 -E

E=0 1 1 1 0 0

E≠0 0 0 不定 1 不定

Page 30: 二、数据类型、运算符、表达式 和常用输入输出函数

例 3: main ( )

{ int a,b,c = 241;

a = c/100%9;

b = ( -1)&&( -2);

printf ("%d, %d \n", a, b);

}

输出为何? 2, 1

Page 31: 二、数据类型、运算符、表达式 和常用输入输出函数

例 4 : int x = 35;

char z = 'A';

int B;

B = ((x&15)&&(z<'a'));

执行上述程序段后, B =? 1

Page 32: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3.3 位运算符 位运算符用于对字节中的位进行运算,参加位运 算的操作数必须是整型常量或变量。 运算符 名 称 运算规则

& 位与 两个相应位全 1 为 1 ,其余为 0

| 位或 两个相应位全 0 为 0 ,其余为 1

^ 位异或 两个相应位相同为 0 ,不相同为 1

<< 左移 把左操作数左移指定位数>> 右移 把左操作数右移指定位数~ 取反 把操作数各位 0 变 1 , 1 变 0

Page 33: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : 将整数 x 的低字节作为整数 z的低字节 , 将整数 y

的低字节作为整数 z的高字节。

15 0

y x

z

15 0 15 0

Page 34: 二、数据类型、运算符、表达式 和常用输入输出函数

x=0x0532, y=0xabcd x y0000010100110010 1010101111001101

& &0000000011111111 0000000011111111

0000000000110010 0000000011001101 | <<8

1100110100000000 z1100110100110010 c d 3 2

Page 35: 二、数据类型、运算符、表达式 和常用输入输出函数

main ()

{ unsigned x,y,z;

x = 0x0532; y = 0xabcd;

z = ( x&0x00ff ) | (y&0x00ff)<<8;

printf ( "z = %x \n", z );

}

输出为: z = cd32

Page 36: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 :① 100&200 =? 100 00000000 01100100 200 00000000 11001000 64 00000000 01000000 ② 100|200 =? 100 00000000 01100100 200 00000000 11001000 236 00000000 11101100 ③ 100^200 =? 100 00000000 01100100 200 00000000 11001000 172 00000000 10101100

Page 37: 二、数据类型、运算符、表达式 和常用输入输出函数

④ -100>>8 =? 100 00000000 01100100 ~ 11111111 10011011 +1 -100 11111111 10011100 >>8 <<8111111111 11111111 (-1) 10011100 00000000 (-2560

0) ⑤ ~3 =? 3 00000000 00000011 ~3 11111111 11111100 (-4) ~ 00000000 00000011 +1 00000000 00000100

Page 38: 二、数据类型、运算符、表达式 和常用输入输出函数

例 3 :设有如下程序: #include <stdio.h>

void main()

{ int x;

printf("%d\t",x=12&7);

printf("%d\t",x=6^9);

printf("%d\t",x=012|5);

printf("%d\t",x= 5|7&3);

}

试写出其输出结果。 4 15 15 7

Page 39: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3.4 赋值运算符1. 基本赋值运算符: =

• 由“ =” 连接的式子称为赋值表达式。其一般形式为: 变量 = 表达式 功能是计算表达式的值再赋予左边的变量。 例如: a = 3

b = i+++--j

c=sin(x)+sin(y)

• 赋值运算符具有右结合性。 a=b=c=1 可理解为: a=(b=(c=1))

Page 40: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 复合赋值运算符: += 、 -= 、 *= 、 /= 、 %= 、 &= 、 |= 、 ^= 、 >>= 、 <<=

• 复合赋值符是在赋值符“ =” 之前加上其它二目运算

符可构成,执行顺序是:先运算,再赋值。 • 复合赋值表达式的一般形式为: 变量 双目运算符 = 表达式 等价于: 变量 = 变量 双目运算符 表达式 例如: a + = 5 等价于 a = a + 5

Page 41: 二、数据类型、运算符、表达式 和常用输入输出函数

x %= 8 等价于 x = x % 8

n &= m n = n & m

x * = y + 7 x = x * ( y + 7 )

x << = n + 1 x = x << ( n + 1)注:赋值号右边是作为一个完整的表达式参加运算

例: int x=6;

执行 x+=x-=x*x; 后, x 的值是 ?

执行 x+=x-=x++; 后, x 的值是 ?

-60

2

Page 42: 二、数据类型、运算符、表达式 和常用输入输出函数

【例 2.4】 复合赋值运算符示例#include "stdio.h"main(){ int a=2, b=3, c=4; a*=b/=c-=a; printf("%d,%d,%d\n",a,b,c); a-=b*=c+=3; printf("%d,%d,%d\n",a,b,c); a=b=c=1; c=(a*=2)+(b+=3)+2; printf("%d\n",c);}

运行结果: 2,1,2

-3,5,5

8

Page 43: 二、数据类型、运算符、表达式 和常用输入输出函数

2.3.5 其他运算符1. 求字节数(长度)运算符: sizeof

用于计算被运算对象所占字节数 使用格式: sizeof( 数据类型 ) 或 sizeof( 表达式 )

例如: • sizeof(double) 值为 8

• sizeof(char)   值为 1

• float f; int i, a[10];

i=sizeof(f);     i 的值将为 4

i=sizeof(a); i 的值将为 20

Page 44: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 逗号运算符:, • 又称顺序运算符,用于把若干表达式组合成一个 表达式,称之为逗号表达式或顺序表达式。 如: 3+5,7+9

• 逗号表达式的一般形式: 表达式 1, 表达式 2, 表达式 3, ……, 表达式 n

表示由左到右依次计算各表达式之值,逗号表达 式之值为表达式 n 之值。 如: a=3*5, a*6 之值为 90

Page 45: 二、数据类型、运算符、表达式 和常用输入输出函数

3. 条件运算符(三目运算符): ? : • 条件表达式的一般形式: 表达式 1 ? 表达式 2 : 表达式 3

• 条件表达式求值过程:

• 三个表达式的类型可以不同,表达式 1 要能得到逻 辑值,整个表达式值类型取表达式 2 和表达式 3 中 较高的类型

表达式 1

取表达式 2值

取表达式 3值

T F

Page 46: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 :执行下列程序段后,变量 a,b,c 的值和 x,y 的值

分别是什么 ?

int x=10, y=9;

int a, b, c;

a=(--x==y++)?--x:++y;

b=x++;

c=y;

8,8,10 9,10

Page 47: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 :请写出下列程序的运行结果 main()

{ int x=5,y=6;

printf("%d\n",((++x==y++)||(x=8))?--x:--y);

printf("%d,%d",x,y);

}

结果: 5

5,7

Page 48: 二、数据类型、运算符、表达式 和常用输入输出函数

例 3 :请写出下列程序的运行结果 main() { int a,b;

int x=1, y=2, z=3; a=x<y?y--<z?z++:y++:x++;

b=x<y?x++:y--<z?z++:y++; printf("%d,%d\n",a,b); printf("%d,%d,%d\n",x,y,z);

}结果: 3,4 1,0,5

Page 49: 二、数据类型、运算符、表达式 和常用输入输出函数

4. 取地址运算符 & 和取内容运算符 *

• 取址运算符 & :取出内存单元的地址 例: p = & i; 表示变量 i 的地址赋给指针变量 p ,即指针

p

指向了变量 i

• 取内容运算符 * :取出指针所指向的变量的内容

例: y = *p; 表示指针 p 指向的变量值赋给变量 y *p = x;

表示变量 x 的值赋给指针所指向的变量

Page 50: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : 指针的概念main ( )

{ int x, *p;

p = &x; x = 20;

printf("x: %d \n ", x );

printf("*p: %d \n", *p);

printf("&x: %x \n", &x);

printf(" p: %x \n ", p );

printf("&p: %x \n", &p );

}

运行结果: x: 20

*p: 20

&x: ffe0

p: ffe0

&p: ffe2

Page 51: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 :分析下列程序的运行结果main ( )

{ int a = 10, b = 8, c, d, *p1, *p2;

p1 = &a; p2 = &b;

c = *p1 + *p2;

d = *p1 - *p2;

printf ("a+b=%d \n", c );

printf ("a-b=%d \n", d );

}

结果: a+b=18 a-b=2

Page 52: 二、数据类型、运算符、表达式 和常用输入输出函数

2.4 表达式及其运算2.4.1 表达式与语句

• 用运算符和括号将运算对象(包括常量、变量和 函数等)连接起来的符合 C 语言规则的式子叫表 达式。• 根据使用运算符的不同,表达式可以分为: 算术表达式、关系表达式、逻辑表达式、赋值表 达式、条件表达式、和逗号表达式等• C 语言规定每个语句的最后必须有一个分号。 i + + a = 3 i + +; a = 3;

Page 53: 二、数据类型、运算符、表达式 和常用输入输出函数

• 表达式可以出现在语句中,语句不可以出现在表

达式中。 a = ( b = 4 ) + ( c = 6 );

a = ( b = 4;) + ( c = 6 ); 错 !

Page 54: 二、数据类型、运算符、表达式 和常用输入输出函数

2.4.2 运算符的优先级和结合性 • 优先级:操作数两边有两个运算符 , 首先参加优 先级高的运算符一侧的运算。 ( 附录Ⅲ , 222页 )

• 结合性:操作数两侧的运算符优先级相同时, C

规定了各种运算符的结合方向,即“自左至右”或

“ 自右至左”。 ( 附录Ⅲ , 222页 )

即:运算符的结合性是规定连续几个相同优先级 的运算符的计算顺序。 结合性为从左到右时,计算就从左到右逐个进行; 结合性为从右到左时,计算就从右到左逐个进行。

Page 55: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : y = 2 + 3 - 4 * 5 + 6

5 - 20

-15 + 6

-9

例 2 : 表达式 a+b+c 等价于 (a+b)+c (左到右) 表达式 a=b=c 等价于 a=(b=c) (右到左) 表达式 *p++ 等价于 *(p++) (右到左) 表达式 *++p 等价于 *(++p) (右到左) 表达式 ++*p 等价于 ++(*p) (右到左)

Page 56: 二、数据类型、运算符、表达式 和常用输入输出函数

2.4.3 数据类型的转换 不同数据类型的常量、变量混合运算时,要先转换成同一类型后进行运算。转换方法有两种:1. 自动转换 • 表达式运算时的转换规则: long double 高 double float unsigned long int long int unsigned int int char, short int 低

Page 57: 二、数据类型、运算符、表达式 和常用输入输出函数

例: 10 + 'a' + i * f - d / e int char float float double long int

int float

float double

double

Page 58: 二、数据类型、运算符、表达式 和常用输入输出函数

• 赋值号两边的数据类型不同时的转换规则: 赋值号右边的类型转换成左边的类型。当右边的 数据类型比左边长时,右边的数据被截取所需的 长度2. 强制转换 形式: ( 类型名 ) 操作数 其中操作数可以是常量、变量或表达式。 例: ( double ) a

( float ) ( x + y )

( int ) 4.5 / 3

Page 59: 二、数据类型、运算符、表达式 和常用输入输出函数

例: main()

{ char c;

int i;

i=11361; /* 0x2c61*/

c=i; /* 0010110001100001*/

printf("%c %d %x", c, c, c);

}

运行结果: a 97 61

Page 60: 二、数据类型、运算符、表达式 和常用输入输出函数

2.5 常用的输入和输出函数 • 在C语言中,所有的数据输入/输出都是由库函 数完成的。 • 使用C语言库函数时,要用预编译命令 #include

将有关 " 头文件 "包括到源文件中。 • 使用标准输入输出库函数时要用到 "stdio.h"文件, 因此源文件开头应有以下预编译命令: #include <stdio.h > 或 #include "stdio.h" 对于下面介绍的 printf 和 scanf 函数,考虑到其使用 频繁,系统允许在使用这两个函数时可不加上述 预编译命令

Page 61: 二、数据类型、运算符、表达式 和常用输入输出函数

2.5.1 格式输入和输出函数1. 格式输出函数 printf ( )

• 功能:向显示器输出信息 • 使用形式: printf (" 输出格式 ", 输出表列 );

输出格式可由三部分组成: 格式说明、按原样输出的字符、转义字符 输出表列是需要输出的一些数据,可以是表达式 例: int a = 123;

printf ("a=%d\n", a);

Page 62: 二、数据类型、运算符、表达式 和常用输入输出函数

有多个输出数据,则: - 输出表列中各输出间用逗号分隔 - 格式说明与输出数据的个数相同且一一对应 如: int i = -5;

float j = 98;

printf ("i = %d, j = %-10.2f \ n", i, j );

输出为: i = -5, j =98.00

Page 63: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 : main ( )

{ int a = 345, b = -1;

printf ("a = %d, %x, %o \n", a, a, a );

printf ("b = %u \n", b );

}

结果为: a = 345, 159, 531

b = 65535

Page 64: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 : main ( ) { float x = 345.678;

printf ("x = %f %e %g\n", x, x, x ); printf ("x = %10.2f %-10.2f %010.2f\n", x, x, x ); printf ("%f %%\n", 1.0/3 ); } 结果为: x = 345.678009 3.45678e+02 345.678 x = 345.68 345.68 0000345.68 0.333333%

Page 65: 二、数据类型、运算符、表达式 和常用输入输出函数

例 3 : main ( ) { printf ("%3s,%7.2s,%.4s,%-5.3s\n", "CHINA","CHINA", "CHINA", "CHINA" ); } 结果为:

CHINA, CH,CHIN,CHI 说明: 当指定的输出宽度小于输出值本身宽度时,

则指定的输出宽度不起作用

Page 66: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 格式输入函数 scanf( ) • 功能:从键盘接受输入信息 • 使用形式: scanf(" 输入格式 " ,地址表列 ) ; 输入格式可由二部分组成: 格式说明、按原样输入的字符 格式说明和输出函数中的输出格式相似。 地址表列由需输入的变量的地址,或字符串首 地址列表组成。 如: int i;

scanf ("%d",&i); 运行时输入: 14

Page 67: 二、数据类型、运算符、表达式 和常用输入输出函数

有多个数据输入,则: - 地址表列中各输入间用逗号分隔 - 格式说明与输入变量的个数相同且一一对应 - 输入数据时,数据之间以一个或多个空格分隔 如: int i, j;

scanf ("%d%d", &i, &j);

运行时输入: 3 4 当双引号中有按原样输入的字符,输入时应按原 样键入。 如: scanf ("a = %d, b = %d",&a, &b);

运行时输入: a = 3, b = 4

Page 68: 二、数据类型、运算符、表达式 和常用输入输出函数

用 "%c" 格式输入字符,则空格和转义字符都作为

有效字符输入 如: scanf ("%c%c%c",&c1, &c2, &c3);

运行时应输入: abc 不应输入: a b c ( 'a' 赋给 c1 , ' ' 赋给 c2 , 'b' 赋

给 c3 ) 输入实数时,不能规定精度。 如: Scanf ("%7.2f", &a ); 不允许。

Page 69: 二、数据类型、运算符、表达式 和常用输入输出函数

例 1 :执行下列语句后 , 输出结果是什么 ?

main()

{ char x,y,z,w;

x='e';

y=x+2;

z=x-3;

w=x-'a'+'A';

printf("x=%c y=%c z=%c w=%c",x,y,z,w);

}

结果: x=e y=g z=b w=E

Page 70: 二、数据类型、运算符、表达式 和常用输入输出函数

例 2 :执行下列语句后 , 输出结果是什么 ? main()

{ int a=10,b=20,c;

c=++a+b--;

printf("a=%d,b=%d,c=%d",a,b,c);

}

结果: a=11,b=19,c=31

Page 71: 二、数据类型、运算符、表达式 和常用输入输出函数

2.5.2 字符输入输出函数1. 字符输出函数 putchar ( ) • 常用形式: putchar (c) c 可以是字符型和整型量,包括转义字符。 • 功能:向终端(显示器)输出一个字符。 如: #include "stdio.h" main ( ) { char a; a= 'b'; putchar(65); putchar('\n'); putchar(a); } 结果: A b

Page 72: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 字符输入函数 getchar() • 常用形式: getchar () • 功能:从终端 ( 或系统隐含指定的输入设备 ) 输入

一 个字符 例:从键盘输入一个小写字母,转换为大写字母输 出。 main()

{ char c; printf("Enter character:");

c=getchar(); putchar(c-32);}

Page 73: 二、数据类型、运算符、表达式 和常用输入输出函数

上机实验 21. 练习 2.7 用程序的形式求出计算结果: 已知整型变量 a 的初值是 5 , b 的初值是 3 ,计算下

列表达式的值。 (filename: CP21.C)

A. !a&&b++;

B. a||b+4&&a*b;

C. a=1,b=2,a>b?++a:++b;

D. ++b,a=10,a+5;

E. a+=b%=a+b;

F. a!=b>2<=a+1;

Page 74: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 已知整数 x 、 y 的值分别为 0x0532 、 0xabcd ,编程 将整数 x 的高字节作为整数 z 的高字节,整数 y 的 高字节作为整数 z 的低字节,并输出整数 z 。 (老书 习题 2.9) (filename:CP22.C)

3. 写一程序,提示用户输入一个数字,然后输出此 数字所对应的数值。(如从键盘输入数字 '8' ,则 输出数值为 8 。) (老书习题 2.10) (filename:CP23.C)

4. 练习 2.9 编程 (filename:CP24.C)

从键盘输入公里数,屏幕输出其英里数。已知 1英里= 1.60934公里(用符号常量)。

Page 75: 二、数据类型、运算符、表达式 和常用输入输出函数

本章结束

Page 76: 二、数据类型、运算符、表达式 和常用输入输出函数

输出格式说明1. 输出格式说明由 % 后跟一个格式字符组成: • % d 以十进制整数的实际长度输出 • % f 以十进制实数形式输出 , 小数部分 6 位 • % c 输出单一字符 • % s 输出字符串 • %% 输出一个百分号 • %x 以十六进制无符号形式输出整数 • %o 以八进制无符号形式输出整数 • %u 以十进制无符号形式输出整数 • %e 以指数形式输出实数 • %g 选用 %f 和 %e 中输出宽度较短的一种格式

Page 77: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 输出格式选择项 • + 结果右对齐 • - 结果左对齐 • 0 用于输出数值,不用位置填 0 (缺省填空格 )

• m 指定输出宽度(列数) • .n 对实数,表示输出 n 位小数 对字符串,表示从左端截取的字符个数 • l 用于输出长整型、双精度型 • L 用于输出长双精度型

Page 78: 二、数据类型、运算符、表达式 和常用输入输出函数

输入格式说明1. 输入格式说明由 % 后跟一个格式字符组成: • % d 用于输入十进制整数 • %x 用于输入十六进制整数 • %o 用于输入八进制整数 • % c 用于输入单个字符 • % s 用于输入字符串,以非空白字符开始,空 白字符结束 • % f 用于输入实数,可用小数或指数形式

Page 79: 二、数据类型、运算符、表达式 和常用输入输出函数

2. 输入格式选择项 • l 用于输入双精度型、长整型 • L 用于输入长双精度型 • m 指定输入数据所占宽度(列数) • * 指定输入项在读入后不赋给相应的变量