C语言基本数据类型

时间:2023-02-11 17:24:57

 基本数据类型

 

 

 

本章介绍常量与变量的概念,以及C语言基本数据类型中的整型、字符型、实型数据的基本知识,各种不同数据类型之间的转换及混合运算。

 

1.1 数据概述

 

 

一个完整的计算机程序,至少应包含两方面的内容,一方面对数据进行描述,另一方面对操作进行描述。数据是程序加工的对象,数据描述是通过数据类型来完成的,操作描述则通过语句来完成。

 C语言不仅提供了多种数据类型,还提供了构造更加复杂的用户自定义数据结构的机制。C语言提供的主要数据类型有:

1.  基本类型: 包括整型、字符型、实型(浮点型)和枚举类型

2.  构造类型: 包括数组、结构体和共用体类型

3.  指针类型

4.  空类型

其中整型、字符型、实型(浮点型)和空类型由系统预先定义,又称标准类型。

基本类型的数据又可分为常量和变量,它们可与数据类型结合起来分类,即为整型常量、整型变量、实型(浮点型)常量、实型(浮点型)变量、字符常量、字符变量、枚举常量、枚举变量。在本章中主要介绍基本数据类型(除枚举类型外),其它数据类型在后续章节中再详细介绍。

1.1.1 常量与符号常量

在程序执行过程中,其值不发生改变的量称为常量。常量区分为不同的类型,如68、0、-12为整型常量,3.14,9.8为实型常量,‘a’,‘b’,‘c’则为字符常量。常量即为常数,一般从其字面即可判别。有时为了使程序更加清晰和便于修改,用一个标识符来代表常量,即给某个常量取个有意义的名字,这种常量称为符号常量。如:

【例1-1】

  #define PI 3.14

  main( )

  {

   float aera;

   aera=10*10*PI;

   printf(“aera=%f\n”,aera);

  }

程序中用#define 命令行定义PI代表圆周率常数3.14,此后凡在文件中出现的PI都代表圆周率3.14,可以和常量一样进行运算,程序运行结果为:

     aera=314.000000

这种用一个标识符代表一个常量的,称为符号常量。注意符号常量也是常量,它的值在其作用域内不能改变,也不能再被赋值。如再用以下语句给PI赋值:

PI=3.14;

是错误的。

习惯上符号常量名用大写字母来表示,变量名用小写,以示区别。

1.1.2 变量

在程序执行过程中,取值可变的量称为变量。一个变量必须有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意变量名和变量值是两个不同的概念。变量名在程序运行中不会改变,而变量值会变化,在不同时期取不同的值。

变量的名字是一种标识符,它必须遵守标识符的命名规则。习惯上变量名用小写字母表示,以增加程序的可读性。必须注意的是大写字符和小写字符被认为是两个不同的字符,因此,sum和Sum是两个不同的变量名,代表两个完全不同的变量。

在程序中,常量是可以不经说明而直接引用的,而变量则必须作强制定义(说明),即“先说明,后使用”,如例1-2和1-3那样。这样做的目的有以下几点:

1. 凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了

int  count;

而在程序中错写成conut,如:   conut=5;

在编译时检查出conut未经定义,不作为变量名,因此输出“变量conut未经说明”的信息,便于用户发现错误,避免变量名使用时出错。

2. 每一个变量被指定为某一确定的变量类型,在编译时就能为其分配相应的存储单元。如指定a和b为整型变量,则为a和b各分配两个字节,并按整数方式存储数据。

3. 每一变量属于一个类型,就便于在编译时据此检查所进行的运算是否合法。例如整型变量a和b可以进行求余运算:

a%b

%是求余运算符(详见第3章),得到a/b的整余数。如果将a和b指定为实型变量,则不允许进行“求余”运算,编译时会指出有关出错信息。

下明各节分别介绍整型、实型、字符型数据及相互转换。

 

1.2整型数据

 

 

C语言中的整型数据包括整型常量和整型变量,描述的是整数的一个子集。 

1.2.1整型常量

整型常量就是整常数。在C语言中,使用的整常数有八进制、十六进制和十进制三种,使用不同的前缀来相互区分。除了前缀外,C语言中还使用后缀来区分不同长度的整数。

1. 八进制整常数

    八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。如0123表示八进制数123,即(123)8,等于十进制数83,即:1*82+2*81+3*80=83;-011表示八进制数-11,即(-11)8,等于十进制数-9。

以下各数是合法的八进制数:

     015(十进制为13) 0101(十进制为65) 0177777(十进制为65535)

     以下各数不是合法的八进制数:

           256(无前缀0)           0382(包含了非八进制数码8) 

2. 十六进制整常数

十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。如0x123表示十六进制数123,即(123)16 ,等于十进制数291,即:1*162+2*161+3*160=291; -011表示十六进制数-11,即(-11)16,等于十进制数-17。

以下各数是合法的十六进制整常数:

     0X2A(十进制为42)  0XA0 (十进制为160)  0XFFFF (十进制为65535)

以下各数不是合法的十六进制整常数:

5A (无前缀0X)  0X3H (含有非十六进制数码)

3. 十进制整常数

   十进制整常数没有前缀,数码取值为0~9。

以下各数是合法的十进制整常数:

237     -568     1627

以下各数不是合法的十进制整常数:

023 (不能有前导0)       23D (含有非十进制数码)

在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错,造成结果不正确。

4.  整型常数的后缀

在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的(注意,字母“L”的小写形式“l”与数字“1”看上去很相似)。

例如:

十进制长整常数 158L (十进制为158) 、358000L (十进制为358000)。

八进制长整常数 012L (十进制为10) 、0200000L (十进制为65536)。

十六进制长整常数 0X15L (十进制为21) 、0XA5L (十进制为165)、 0X10000L (十进制为65536)。

长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免出错。

无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u,0x38Au,235Lu 均为无符号数。前缀,后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。

1.2.2 整型变量

1. 整型变量的分类

整型变量可分为基本型、短整型、长整型、和无符号型四种。

(1)     基本型

     类型说明符为int,在内存中占2个字节(在IBM PC上,下同),其取值为基本整常数。

(2)     短整型

     类型说明符为short int或short。所占字节和取值范围均与基本型相同。

(3)     长整型

    类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。

(4)     无符号型

类型说明符为unsigned,存储单元中全部二进位(bit)用作存放数本身,而不包括符号。无符号型又可与上述三种类型匹配而构成:

²  无符号基本型 类型说明符为unsigned int或unsigned。

²  无符号短整型 类型说明符为unsigned short。

²  无符号长整型 类型说明符为unsigned long 。

各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数,但可存放的数的范围比一般整型变量中数的范围扩大一倍。表2-1列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。

 

     表1-1 整型变量的字节数及表示范围

 

类型说明符

分配字节数

数的范围

int

2

-32768~32767                 即  -215~(215-1)

short [int]

2

-32768~32767                 即  -215~(215-1)

long [int]

4

-2147483648~2147483647     即  -231~(231-1)

unsigned [int]

2

0~65535                       即  0 ~(216-1)

unsigned short

2

0~65535                       即  0 ~(216-1)

unsigned long

4

0~4294967295                 即  0 ~(232-1)

 

2.  整型变量的说明

     变量的说明,也即变量的定义,一般形式为:

类型说明符 变量名标识符1,变量名标识符2,...;

例如:

int a,b,c;         /* a,b,c为整型变量*/

long m,n;        /* m,n为长整型变量*/

unsigned p,q;    /* p,q为无符号整型变量*/

在书写变量说明时,应注意以下几点:

(1) 允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。

(2)  最后一个变量名之后必须以“;”号结尾。

(3)  变量说明必须放在变量使用之前。一般放在函数体的开头部分。

另外,也可在说明变量为整型的同时,给出变量的初值。其格式为:

类型说明符 变量名标识符1=初值1,变量名标识符2=初值2,...;

通常若有初值时,往往采用这种方法,下例就是用了这种方法。

【例1-2】

  main( )

  {

   inta=3,b=5;

  printf(“a+b=%d\n”,a+b);

  }

 程序的运行结果为:

  a+b=8

 

1.3实型数据

 

 

 1.3.1实型常量

实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有二种形式, 十进制数形式和指数形式。

1.  十进制数形式

由数码0~ 9和小数点组成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的实数。

2.  指数形式
    由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为a E n (a为十进制数,n为十进制整数)其值为a*10n如: 2.1E5 (等于2.1*105), 3.7E-2 (等于3.7*10-2) , -2.8E-2 (等于-2.8*10-2)

以下不是合法的实数 :

345(无小数点),E7 (阶码标志E之前无数字),-5 (无阶码标志),53.-E3 (负号位置不对),2.7E (无阶码)。

标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356f和356.是等价的。

1.3.2 实型变量

实型变量分为两类:

1.  单精度型

类型说明符为float,在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。

2.  双精度型,

类型说明符为double ,在Turbo C中双精度型占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

实型变量说明的格式和书写规则与整型相同。

例如: float x,y;                        /*  x,y为单精度实型变量*/

    double a,b,c;                     /*   a,b,c为双精度实型变量*/

也可在说明变量为实型的同时,给出变量的初值。

例如: float x3.2 , y=5.3;               /*   x,y为单精度实型变量,且有初值 */

    double a=0.2 , b=1.3 , c=5.1 ;    /*   a,b,c为双精度实型变量, 且有初值*/

应当说明,实型常量不分单精度和双精度。一个实型常量可以赋给一个float或double型变量,根据变量的类型截取实型常量中相应的有效位数字。下面的例子说明了单精度实型变量对有效位数字的限制。

【例1-3】

main( )

{

    float a;

    a=0.123456789;               

    printf("a=%f",a);

}

由于单精度实型变量只能接收7位有效数字,因此上例中最后两位小数不起作用。程序运行结果为:

a=0.123457

如果a改为双精度实型变量,则能全部接收上述9位数字并存储在变量a中。

下面的例子说明了float和double的不同。

【例1-4】

voidmain()

{

    float a;

    double b;

    a=33333.33333;

    b=33333.33333333333333;

    printf("a=%f\nb=%f\n",a,b);            /* 用格式化输出函数输出a和b的值 */

}

程序运行结果为:

a=33333.332031

b=33333.333333

本例中,由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。b 是双精度型,有效位为十六位。但Turbo C 规定小数后最多保留六位,其余部分四舍五入。

 

1.4字符型数据

 

 

字符型数据包括字符常量、字符变量和字符串常量。

1.4.1 字符常量

字符常量是用单引号括起来的一个字符。例如'a' , 'b' , 'A' , '+', '?' 都是合法字符常量。在C语言中,字符常量有以下特点:

1.  字符常量只能用单引号括起来,不能用双引号或其它括号。

2.  字符常量只能是单个字符,不能是字符串。

3.  字符可以是字符集中任意字符。但数字被定义为字符型之后就不再是原来的数值了。如'5'和5 是不同的量。'5'是字符常量,5是整型常量。

除了以上形式的字符常量外,C语言还允许用一种特殊形式的字符常量,即转义字符。转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。常用的转义字符及其含义见表2-2。

广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2-2中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示ASCII码为八进制101的字符,即为字符‘A’ 。与此类似,\102表示字符‘B’,\134表示反斜线‘\’,\XOA表示换行。

【例1-5】和【例1-6】展示了转义字符的使用。

 

表1-2 常用转义字符表

转义字符

转义字符的意义

 

 

\n

回车换行

\\

反斜线符( \ )

\t

横向跳到下一制表位置

\'

单引号符

\v

竖向跳格

\”

双引号符

\b

退格

\a

鸣铃

\r

回车

\ddd

1~3位八进制数所代表的字符

\f

走纸换页

\xhh

1~2位十六进制数所代表的字符

               

【例1-5】

voidmain( )

{

inta,b,c;                                            /* 定义 a、b、c为整数 */

a=5;b=6; c=7;

printf("%d\n\t%d   %d\n       %d       %d\t\b%d\n",a,b,c,a,b,c);   /* 按要求格式输出a,b,c的值*/

}

程序运行结果:

5       

              6 7

       5  67

程序在第一列输出a值5之后就是“\n”,故回车换行;接着又是“\t”,于是跳到下一制表位置(设制表位置间隔为8),再输出b值6;空二格再输出c 值7后又是"\n",因此再回车换行;再空二格之后又输出a值5;再空三格又输出b的值6;再次后"\t"跳到下一制表位置(与上一行的6 对齐),但下一转义字符“\b”又使退回一格,故紧挨着6再输出c值7。

请看下面的例子:

【例1-6】

main()

{

printf(“┗┛┗┛ab┗┛c\t┗┛de\rf\tg\n”);

printf(“h\ti\b\bj┗┛┗┛┗┛k”);

}

本例中的一个printf函数先在第一行左端开始输出“┗┛┗┛ab┗┛c”,然后遇到“\t”,它的作用是跳格,跳到下一制表位置,从第九列开始,故在第9~11列上输出“┗┛de”。下面遇到“\r”,它代表“回车”(不换行),返回到本行最左端(第1列),输出字符“f”,然后“\t”再使当前输出位置移到第9列,输出“g”。下面是“\n”,作用是“回车换行”。第二个ptintf函数先在第1列输出字符“h”,后面的“\t”使当前输出位置跳到第9列,输出字母“i”,然后输出位置应移到下一列(第10列)准备输出下一个字符。下面到两个“\b”,“\b”的作用是“退一格”,因此“\b\b”的作用是使当前输出位置退回到第8列,接着输出字符“j┗┛┗┛┗┛k”。

程序运行时在打印机上得到以下结果:

f┗┛ab┗┛c┗┛┗┛gde

h┗┛┗┛┗┛┗┛┗┛┗┛ji┗┛┗┛k

注意在显示屏上最后看道的结果与上述打印结果不同,是:

f┗┛┗┛┗┛┗┛┗┛┗┛┗┛gde

h┗┛┗┛┗┛┗┛┗┛┗┛j┗┛┗┛┗┛k

这是由于“\r”使当前输出位置回到本行开头,自此输出的字符(包括空格和跳格所经过的位置)将取代原来屏幕上该位置上显示的字符。所以原有的“┗┛┗┛ab┗┛c┗┛┗┛┗┛”被新的字符“f┗┛┗┛┗┛┗┛┗┛┗┛┗┛g”代替,其后的“de”未被新字符取代。回车换行后先输出“h┗┛┗┛┗┛┗┛┗┛┗┛┗┛i”,退两格后再输出“j┗┛┗┛┗┛k”,j后面第一个“┗┛”将原有的字符“i”取而代之。因此屏幕上看不到“i”。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误以为未输出应输出的字符。而在打印机输出时,不象显示屏那样会“抹掉”原字符,留下了不可磨灭的痕迹,它能真正反映输出的过程和结果。

1.4.2 字符变量

字符型变量用来存放字符常量,即单个字符。每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。不要以为一个字符变量中可以存放一个字符串。字符变量的类型说明符是char。字符变量类型说明的格式和书写规则都与整型变量相同。

例如:

chara,b;                            /* 定义字符变量 a和b */

     a=’x’,b=’y’;                      /* 给字符变量a和b分别赋值’x’和’y’*/

将一个字符常量存放到一个变量中,实际上并不是把该字符本身放到变量内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。例如字符’x’的十进制ASCII码是120,字符’y’的十进制ASCII码是121。对字符变量a,b赋予'x'和'y'值:a='x';b='y';实际上是在a,b两个单元内存放120和121的二进制代码:

           a 0 1 1 1 1 0 00                      (ASCII 120)

     b 0 1 1 1 1 0 0 1                      (ASCII 121)

既然在内存中,字符数据以ASCII存储,它的存储形式与整数的存储形式相类似,所以也可以把它们看成是整型量。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符数据按整型形式输出,也允许把整型数据按字符形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码当作整数输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。

 整型数据为二字节量,字符数据为单字节量,当整型数据按字符型量处理时, 只有低八位字节参与处理。

【例1-7】

main()

{

char a,b;

a=120;

b=121;

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

}

程序运行结果为:

x,y

120,121

在本程序中,说明a,b为字符型变量,但在赋值语句中赋以整型值。从结果看,a,b值的输出形式取决于printf函数格式串中的格式符,当格式符为"c"时,对应输出的变量值为字符,当格式符为"d"时,对应输出的变量值为整数。

【例1-8】

main()

{

char a,b;

a='x';

b='y';

a=a-32;                                 /* 把小写字母换成大写字母*/

b=b-32;                                 /* 把小写字母换成大写字母*/

printf("%c,%c\n%d,%d\n",a,b,a,b);      /* 以字符型和整型输出 */

}

程序运行结果为:

X,Y

88,89

本例中,a,b被说明为字符变量并赋予字符值,C语言允许字符变量参与数值运算,即用字符的ASCII 码参与运算。由于大小写字母的ASCII 码相差32,即每个小写字母比它相应的大写字母的ASCII码大32,如’a’=’A’+32,’b’=’B’+32。因此,程序运算后把小写字母换成大写字母。然后分别以字符型和整型输出。

1.4.3字符串常量

前面已经提到,字符常量是由一对单引号括起来的单个字符。C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是由一对双引号括起的字符序列。例如: "CHINA" ,"C program: , "$12.5" 等都是合法的字符串常量。可以输出一个字符串,如:

printf(“Helloworld!”);

初学者容易将字符常量与字符串常量混淆。’a’是字符常量,“a”是字符串常量,二者不同。假设c被指定为字符变量:

charc;

c=’a’;

是正确的,而

c=“a”是错误的。c=“Hello”也是错误的。不能把一个字符串赋给一个字符变量。

那么,‘a’和“a”究竟有什么区别呢?C语言规定:在每一个字符串的结尾加一个字符串结束标记,以便系统据此判断字符串是否结束。C语言规定以字符’\0’作为字符串结束标记。’\0’是一个ASCII码为0的字符,也就是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。如果有一个字符串“WORLD”,实际上在内存中是

W

O

R

L

D

\0

它的长度不是5个字符,而是6个字符,最后一个字符为’\0’。但在输出时不输出’\0’。例如在printf(“WORLD”)中,输出时一个一个字符输出,直到遇到最后的’\0’字符,就知道字符串结束,停止输出。注意,在写字符串时不必加’\0’,否则画蛇添足。’\0’是系统自动加上的。“a”实际包含两个字符,’a’和’\0’,因此,把它赋给一个字符变量c:

c=“a”;

显然是不行的。

在C语言中,没有专门的字符串变量,字符串如果需要存放在变量中,需要用字符数组来存放,这将在第七章中介绍。

一般来说,字符串常量和字符常量之间有如下的主要区别:

1.  字符常量由单引号括起来,字符串常量由双引号括起来。

2.  字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

3.  可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。

4.  字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符‘\0’(ASCII码为0)。这是字符串结束的标志。

 

1.5 各类数值型数据之间的混合运算

 

 

整型、单精度型、双精度型数据可以混合运算。前已述及,字符型数据可以和整型数据通用,因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。例如:

10+’a’+1.5-12.34*’b’

是合法的。在进行运算时,不同类型的数据要转换成同一类型,然后进行运算。转换的方法有两种,一种是自动转换,一种是强制转换。

1.  自动转换

自动转换发生在不同类型的数据混合运算时,由编译系统自动完成。自动转换遵循以下规则:

(1)  若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

(2)  转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

(3)  所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

(4)  char型和short型参与运算时,必须先转换成int型。

(5)  在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。图1-1表示了类型自动转换的规则。


图中横向向左的箭头表示必定发生的转换,如字符型数据必先转成整型,单精度数据先转成双精度数据,等等。

图1-1 类型转换方向

图中纵向的箭头表示当运算对象为不同的类型时转换的方向。例如整型与双精度型数据进行运算,先将整型数据转换成双精度型数据,然后在两个同类型数据(双精度)间进行运算,结果为双精度型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为整型先转成无符号型,再转成长整形,再转成双精度型。如果一个整型数据与一个双精度型数据运算,是直接将整型转成双精度型。同理,一个整型数据与一个长整型数据运算,先将整型转成长整型。

换言之,如果有一个数据是单精度型或双精度型,则另一数据要先转成双精度型,结果为双精度型。如果两个数据中*别为长整型,则另一数据转成长整型,结果为长整型。其它依此类推。假设i已指定为整型变量,f为单精度实型变量,d为双精度实型变量,e为长整型变量,有下面式子:

10+’a’+i*f-d/e

运算次序为:

1.  进行10+’a’的运算,先将’a’转换成整数97,运算结果为107。

2.  进行i*f的运算,先将’i’和’f’都转换成双精度型,运算结果为双精度型。

3.  整数107和i*f的积相加,先将整数107转换成双精度型(107.000000),运算结果为双精度型。

4.  进行d/e的运算,先将e转换成双精度型,运算结果为双精度型。

5.  将10+’a’+i*f的结果与d/e的商相减,结果为双精度型。

上述的类型转换是由系统自动进行的。

2.  强制转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:

             (类型说明符) (表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float) a 把a转换为实型,(int)(x+y)把x+y的结果转换为整型。

在使用强制转换时应注意以下问题:

(1) 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。

(2) 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

【例1-9】

main( )

{

float f=5.75;

printf("(int)f=%d,f=%f\n",(int)f,f);

}

     运行结果:

(int)f=5,f=5.75

本例表明,f虽强制转为int型,但只在运算中起作用, 是临时的,而f本身的类型并不改变。因此,(int)f的值为 5(删去了小数),而f的值仍为5.75。