790 likes | 896 Views
二、数据类型、运算符、表达式 和常用输入输出函数. C 语言的基本数据类型有: • char (字符型) • int (整型) • float (实型或浮点型) • double (双精度实型) 2.1 常量 • 常量:程序运行过程中其值不能被改变的量称。 • 常量 分为:整型常量、实型常量、字符常量、 字符串常量、符号常量. 2.1.1 整型常量. 整型常量即整常数 1 . 整数 • 取值范围:一般占一个机器字,如字长两字节, 则为 -32768 ~ +32767 • 表示形式:
E N D
二、数据类型、运算符、表达式和常用输入输出函数二、数据类型、运算符、表达式和常用输入输出函数 C语言的基本数据类型有: • char(字符型) • int(整型) • float (实型或浮点型) • double (双精度实型) 2.1 常量 • 常量:程序运行过程中其值不能被改变的量称。 • 常量分为:整型常量、实型常量、字符常量、 字符串常量、符号常量
2.1.1 整型常量 整型常量即整常数 1.整数 • 取值范围:一般占一个机器字,如字长两字节, 则为 -32768 ~ +32767 • 表示形式: 十进制整数 以非0开头的整数 八进制整数 以0开头的整数 十六进制整数 以0x或0X开头的整数 例:-123、456、0123、-0x123
2. 长整数 • 取值范围:占四字节 -2147483648 ~ +2147483647 • 表示形式:在整数后面加字母L或l 例:456l、-0456l、0x456l
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、e 2. 实型常量不分单、双精度, 都按双精度double型处理
2.1.3 字符常量 1.字符常量是用一对单引号(作为定界符)括起来的 一个字符。 'A', 'a', '5', '?', '+', '!', '$'。 字符不能是单引号 '、双引号 "、反斜杠 \。 2.字符常量具有数值,即其 ASCII代码值。 C = 'A';与 C = 65;等价。 3.转义字符 一对单引号括起来,里面是 反斜线开头,后跟一个字符,如'\n'。或 反斜线开头,后跟一个一到三位八进制数,或 后跟一个一到二位x开头的十六 进制数。(表 2.2)
2.1.4 字符串常量 1.字符串常量一对双引号括起来的字符系列。 例:"hello!", "program", "a", "123.45" 2.存储形式 字符串的每个字符占一个字节,在其尾部自动 追加一个字符'\0'。 h e l l o ! \0 104 101 108 108 111 33 0
2.1.5 符号常量 符号常量即用一个特定的符号来代表一个常量 • 定义:#define符号常量 常量(字符串) 例: #define R 5.179 • 符号常量须“先定义,后使用”,一般用大写字母 例: #definePRICE35 #defineNUM10 #defineSUM PRICE*NUM main( ) { printf("total=%d\n", SUM); } 结果:total=350
2.2 变量 • 变量:程序运行过程中其值可以改变的量。 • 变量名和变量值: 变量名 (标识符) a 变量值 98 变量存储单元地址 • 变量分为两类 普通变量:存放各种普通的数据 指针变量:存放地址
• 变量须“先定义,后使用”,一般用小写字母 • 普通变量定义的一般形式: 数据类型 变量名表; 例: int a; int a, b; • 定义普通变量时可以对它初始化 例: int a = 3, b = 2;
2.2 变量 2.2.1 整型变量 2.2.2 实型变量 2.2.3 字符变量 2.2.4 指针变量
• 例2: main() { long a; int b=1; a=32767+b; printf("%d\n",a); } 整型数据的溢出: • 例1: main() { int a,b; b=32767; a=b+1; printf("%d\n",a); } 32767: 0111111111111111 -32768: 1000000000000000
2.2.2 实型变量 例:main() { float x,y; x=111111.111; y=222222.222; printf("%f\n",x+y); } 运行结果为 333333.328125
2.2.3 字符变量 • 说明字符变量使用 char标识符 • 一个字符变量在内存中占一个字节 • 将一个字符常量赋值给一个字符变量,实际上 是把该字符的 ASCII 代码放到字符变量对应的 内存单元中去 • 字符数据与整型数据的存储形式相类似,可以 相互赋值或混合运算,一个字符数据既可以以 字符形式输出,也可以整数形式输出
例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
2.2.4 指针变量 • 指针变量的内存单元中存放的是一个变量的地址 i j i j 变量j的地址赋给指针变量i指针变量i指向变量j 1000 1000 1000 1000
• 可在定义变量的同时,定义相应类型的指针变量; 指针变量定义的一般形式: 数据类型 *指针变量名; 例: int *p;/*定义p是指向整型变量的指针变量*/ float *y; /*定义y是指向实型变量的指针变量*/ char *s; /*定义s是指向字符型变量的指针变量*/ • 定义指针变量时可以对它初始化 int i,*p = &i;
2.3 运算符 2.3.1 算术运算符 2.3.2 关系运算符和逻辑运算符 2.3.3 位运算符 2.3.4 赋值运算符 2.3.5 其他运算符
2.3.1 算术运算符 1. 加、减、乘、除和取余运算符:+、-、*、/、% • 除号/ - 当两个整型数相除时,结果为整数(商的整数 部分) -当被除数和除数只要有一个是实型数时,结果 为实数的商。 • 取余号 % 只能对整型数运算。
2.自增、自减运算符:++、-- • 用法 - 前置运算: ++或--用在变量之前,先将变量的 值增1或减1,再将该变量的新值用于表达式中 - 后置运算: ++或--用在变量之后,先将变量的 值用于表达式中,再将该变量的值增1或减1 例: i=5+j--; i=5+--j; • 只能用于变量,不能用于常量和表达式 合法:i++; --j; i=(j++)*5; 非法:6--; i=(j*5)++;
• 例: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语法规则的式子。
2.3.2 关系运算符和逻辑运算符 1. 关系运算符(比较运算符) 用于比较两个表达式值的大小,有6种: >、>=、<、<=、= =、!= 2. 关系表达式 •是用关系运算符把两个表达式联系起来的式子 •关系表达式成立,其值为真,用1代表;否则为假, 用0代表。 如 int a = 4, b = 8; 则 关系表达式 a > b 的值为0, 而 关系表达式 a < b 的值为1。
这里的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
关系表达式中字符型数据按其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。
3. 逻辑运算符 用于对逻辑量进行运算,有3种: && 逻辑与 双目运算符 || 逻辑或 双目运算符 ! 逻辑非 单目运算符 4. 逻辑表达式 • 是用逻辑运算符联系起来的表达式。如: a && b; a || b; ! a ; • 逻辑运算符两边是逻辑值。非0为真,0为假。 •逻辑表达式的值也是逻辑值。真为 1,假为0。
• 运用逻辑表达式的注意事项 判断数值是否为真时,非0代表真,0代表假 逻辑运算符两侧的操作数不仅可以是整数,也 可以是其他数据类型,只要该类型的数据值最 终能得到0或非0值 逻辑表达式中,不一定对逻辑运算符两侧的表达 式都求值 (&&、||) 数学上的数值区间不能直接用在C语言的判断条 件上 如数学上的 1<x≤10,不应写成:1<x<=10; 而应写成:(1<x)&&(x<=10)
例1:int x, y, z, w; x = y = z = -1; w = (+ + x || + + y) && + + z; printf ("%d, %d, %d, %d\n", x, y, z, w); 输出为何? &&前的操作数值若是假,则后面的表达式无需运算 ||前的操作数值若是真,则后面的表达式无需运算
例2:逻辑表达式(!E) 的值等价于_____。 A) E == 0 B) E != 1 C) E != 0 D)-E
例 3: main ( ) { int a,b,c = 241; a = c/100%9; b = ( -1)&&( -2); printf ("%d, %d \n", a, b); } 输出为何? 2, 1
例4: int x = 35; char z = 'A'; int B; B = ((x&15)&&(z<'a')); 执行上述程序段后, B =? 1
2.3.3 位运算符 位运算符用于对字节中的位进行运算,参加位运 算的操作数必须是整型常量或变量。
y x 15 0 15 0 z 15 0 例1 : 将整数x的低字节作为整数z的低字节,将整数y的 低字节作为整数z的高字节。
x=0x0532, y=0xabcd x y 00000101001100101010101111001101 && 0000000011111111 0000000011111111 0000000000110010 0000000011001101 | <<8 1100110100000000 z 1100110100110010 c d 3 2
main () { unsigned x,y,z; x = 0x0532; y = 0xabcd; z = ( x&0x00ff ) | (y&0x00ff)<<8; printf ( "z = %x \n", z ); } 输出为: z = cd32
例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
④ -100>>8 =? 100 00000000 01100100 ~ 11111111 10011011 +1 -100 11111111 10011100 >>8 <<8 111111111 11111111 (-1) 10011100 00000000 (-25600) ⑤ ~3 =? 3 00000000 00000011 ~3 11111111 11111100 (-4) ~ 00000000 00000011 +1 00000000 00000100
例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
2.3.4 赋值运算符 1. 基本赋值运算符:= • 由“=”连接的式子称为赋值表达式。其一般形式为: 变量=表达式 功能是计算表达式的值再赋予左边的变量。 例如:a = 3 b = i+++--j c=sin(x)+sin(y) • 赋值运算符具有右结合性。 a=b=c=1 可理解为:a=(b=(c=1))
2. 复合赋值运算符: +=、 -= 、 *= 、 /= 、 %= 、 &= 、 |= 、 ^= 、>>= 、<<= • 复合赋值符是在赋值符“=”之前加上其它二目运算 符可构成,执行顺序是:先运算,再赋值。 • 复合赋值表达式的一般形式为: 变量 双目运算符 = 表达式 等价于: 变量 = 变量 双目运算符 表达式 例如: a + = 5 等价于 a = a + 5
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
【例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
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
2. 逗号运算符:, • 又称顺序运算符,用于把若干表达式组合成一个 表达式,称之为逗号表达式或顺序表达式。 如:3+5,7+9 • 逗号表达式的一般形式: 表达式1, 表达式2, 表达式3, ……, 表达式n 表示由左到右依次计算各表达式之值,逗号表达 式之值为表达式n之值。 如:a=3*5, a*6 之值为90
T F 表达式1 取表达式2值 取表达式3值 3. 条件运算符(三目运算符): ? : • 条件表达式的一般形式: 表达式1 ? 表达式2 : 表达式3 • 条件表达式求值过程: • 三个表达式的类型可以不同,表达式1要能得到逻 辑值,整个表达式值类型取表达式2和表达式3中 较高的类型
例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
例2:请写出下列程序的运行结果 main() { int x=5,y=6; printf("%d\n",((++x==y++)||(x=8))?--x:--y); printf("%d,%d",x,y); } 结果:5 5,7
例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
4. 取地址运算符&和取内容运算符* • 取址运算符&:取出内存单元的地址 例:p = & i; 表示变量 i的地址赋给指针变量p,即指针 p 指向了变量 i • 取内容运算符* :取出指针所指向的变量的内容 例:y = *p; 表示指针 p 指向的变量值赋给变量 y *p = x; 表示变量x的值赋给指针所指向的变量
例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