谭浩强C语言-03
3 数据类型、运算符与表达式
3.1 C语言的数据类型
在第一章中,我们已经看到程序中使用的各种变量都应预先加以定义,即先定义,后使用。对变量的定义可以包括三个方面:
·数据类型
·作用域
1. 基本数据类型:基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。
2. 构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在
3. 指针类型:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
4. 空类型:在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的
3.2 常量与变量
整型量包括整型常量、整型变量。
3.2.1 常量和符号常量
其中
【例3.1
#define PRICE 30
main()
{
int num,total;
}
3.2.2 变量
![]() |
3.3 整型数据
3.3.1 整型常量的表示方法
1) 十进制整常数:十进制整常数没有前缀。其数码为
237
以下各数不是合法的十进制整常数:
023 (
在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。
2) 八进制整常数:八进制整常数必须以
015(
3) 十六进制整常数:十六进制整常数的前缀为
以下各数是合法的十六进制整常数:
0X2A(
4) 整型常数的后缀:在
例如:
十进制长整常数:
158L (
八进制长整常数:
012L (
十六进制长整常数:
0X15L (
长整数
无符号数也可用后缀表示,整型常数的无符号数的后缀为“
例如:
358u,0x38Au,235Lu
前缀,后缀可同时使用以表示各种类型的数。如
3.3.2 整型变量
1.
int i;
i=10;
i
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
数值是以补码表示的:
| 0 | 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 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
2.
1) 基本型:类型说明符为
2) 短整量:类型说明符为
3) 长整型:类型说明符为
4) 无符号型:类型说明符为
有符号整型变量:最大表示
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 类型说明符 | 数的范围 | 字节数 |
| int | -32768~32767 即-215~(215-1) | 2 |
| unsigned int | 0~65535 即0~(216-1) | 2 |
| short int | -32768~32767 即-215~(215-1) | 2 |
| unsigned short int | 0~65535 即0~(216-1) | 2 |
| long int | -2147483648~2147483647即-231~(231-1) | 4 |
| unsigned long | 0~4294967295 即0~(232-1) | 4 |
以13
int型:
| 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
short int型:
| 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
long int型:
| 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned int型:
| 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned short int
| 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
unsigned long int
| 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 11 | 01 |
3.
例如:
unsigned p,q;(p,q为无符号整型变量)
【例3.2
main()
{
}
4.
【例3.3
main()
{
int a,b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
【例3.4
main(){
long x,y;
int a,b,c,d;
x=5;
y=6;
a=7;
b=8;
c=x+a;
d=y+b;
printf("c=x+a=%d,d=y+b=%d\n",c,d);
3.4 实型数据
3.4.1 实型常量的表示方法
实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式,指数形式。
1) 十进制数形式:由数码
0.0
2) 指数形式:由十进制数,加阶码标志“
0.5E7 (
-2.8E-2 (
标准C允许浮点数使用后缀。后缀为“
【例3.5
main(){
printf("%f\n ",356.);
printf("%f\n ",356);
printf("%f\n ",356f);
}
3.4.2 实型变量
1.
| + | .314159 | 1 |
2.
在
| 类型说明符 | 比特数(字节数) | 有效数字 | 数的范围 |
| float | 32(4) | 6~7 | 10-37~1038 |
| double | 64(8) | 15~16 | 10-307~10308 |
| long double | 128(16) | 18~19 | 10-4931~104932 |
3.
【例3.6
main()
{float a,b;
}
【例3.7
main()
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("%f\n%f\n",a,b);
l 从本例可以看出,由于
l b
3.4.3 实型常数的类型
3.5 字符型数据
3.5.1 字符常量
字符常量是用单引号括起来的一个字符。
例如:
1) 字符常量只能用单引号括起来,不能用双引号或其它括号。
2) 字符常量只能是单个字符,不能是字符串。
3) 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如
3.5.2 转义字符
| 转义字符 | 转义字符的意义 | ASCII代码 |
| \n | 回车换行 | 10 |
| \t | 横向跳到下一制表位置 | 9 |
| \b | 退格 | 8 |
| \r | 回车 | 13 |
| \f | 走纸换页 | 12 |
| \\ | 反斜线符"\" | 92 |
| \' | 单引号符 | 39 |
| \” | 双引号符 | 34 |
| \a | 鸣铃 | 7 |
| \ddd | 1~3位八进制数所代表的字符 | |
| \xhh | 1~2位十六进制数所代表的字符 | |
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的
【例3.8
main()
{
int a,b,c;
a=5; b=6; c=7;
printf(“ ab
3.5.3 字符变量
字符变量用来存储字符常量,即单个字符。
字符变量的类型说明符是
3.5.4 字符数据在内存中的存储形式及使用方法
实际上是在
a
| 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
b
| 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
所以也可以把它们看成是整型量。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。
整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。
【例3.9
main()
{
char a,b;
a=120;
b=121;
printf("%c,%c\n",a,b);
}
【例3.10
char a,b;
a='a';
b='b';
a=a-32;
b=b-32;
printf("%c,%c\n%d,%d\n",a,b,a,b);
本例中,
3.5.5 字符串常量
1) 字符常量由单引号括起来,字符串常量由双引号括起来。
2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。这是与
4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加
例如:
字符串
| C | | p | r | o | g | r | a | m | \0 |
字符常量
'a'
| a |
"a"
| a | \0 |
3.6 变量赋初值
在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量提供初值。本小节先介绍在作变量定义的同时给变量赋以初值的方法。这种方法称为初始化。在变量定义中赋初值的一般形式为:
例如:
int a=3
int b,c=5;
charch1='K',ch2='P';
应注意,在定义中不允许连续赋值,如
【例3.11
int a=3,b,c=5;
b=a+c;
printf("a=%d,b=%d,c=%d\n",a,b,c);
3.7 各类数值型数据之间的混合运算
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:
1)
2)
3)
4)
5)

float PI=3.14159;
int s,r=5;
s=r*r*PI;
printf("s=%d\n",s);
}
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
1) 类型说明符和表达式都必须加括号
2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
【例3.13
main(){
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
}
3.8 算术运算符和算术表达式
3.8.1 C 运算符简介
C语言的运算符可分为以下几类:
1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4. 位操作运算符
5. 赋值运算符
6. 条件运算符
7. 逗号运算符
8. 指针运算符
9. 求字节数运算符
10. 特殊运算符
3.8.2 算术运算符和算术表达式
1.
printf("\n\n%d,%d\n",20/7,-20/7);
printf("%f,%f\n",20.0/7,-20.0/7);
【例3.15
main(){
printf("%d\n",100%3);
2.
3.
其一般形式为:
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
4.
++i
--i
i++
i--
在理解和使用上容易出错的是
【例3.16
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
i
【例3.17
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
这个程序中,对P=(i++)+(i++)+(i++)
3.9 赋值运算符和赋值表达式
1.
变量
例如:
y=i+++--j
赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此
可理解为
在其它高级语言中,赋值构成了一个语句,称为赋值语句。而在C中,把“
例如,式子
x=(a=5)+(b=8)
是合法的。它的意义是把
在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其未尾加上分号就构成为语句。因此如
x=8;a=b=c=5
都是赋值语句,在前面各例中我们已大量使用过了。
2.
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:
1)
2)
3)
【例3.18
int a,b=322;
float x,y=8.88;
char c1='k',c2;
a=y;
x=b;
a=c1;
c2=b;
printf("%d,%f,%d,%c",a,x,a,c2);
3.
在赋值符“
构成复合赋值表达式的一般形式为:
变量
它等效于
变量=变量
例如:
复合赋值符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。
3.10 逗号运算符和逗号表达式
其一般形式为:
表达式1,表达式2
其求值过程是分别求两个表达式的值,并以表达式
【例3.19
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf("y=%d,x=%d",y,x);
}
1)
例如:
形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:
整个逗号表达式的值等于表达式
2)
3.11 小结
3.11.1 C的数据类型
基本类型,构造类型,指针类型,空类型
3.11.2 基本类型的分类及特点
|
| 类型说明符 | 字节 | 数值范围 |
| 字符型 | char | 1 | C字符集 |
| 基本整型 | int | 2 | -32768~32767 |
| 短整型 | short int | 2 | -32768~32767 |
| 长整型 | long int | 4 | -214783648~214783647 |
| 无符号型 | unsigned | 2 | 0~65535 |
| 无符号长整型 | unsigned long | 4 | 0~4294967295 |
| 单精度实型 | float | 4 | 3/4E-38~3/4E+38 |
| 双精度实型 | double | 8 | 1/7E-308~1/7E+308 |
3.11.3 常量后缀
F
3.11.4 常量类型
3.11.5 数据类型转换
·自动转换:
·强制转换:
3.11.6 运算符优先级和结合性
3.11.7 表达式
文章来自 : 谭浩强C语言-03


浙公网安备 33010602011771号