C Primer Plus 第3章 数据和C

断了今生、忘了曾经 提交于 2019-12-05 20:54:41

3.1示例程序

程序清单3.1 rhodium.c程序

------

/*rhodium.c用金属铑衡量您的体重*/
#include <stdio.h>
int main (void)
{
folat weight,value;//folat类型可以处理带有小数点的数字

printf("Are you worth you weight in rhodium? \n");
printf("Let's check it out. \n");
printf("Please enter your weight in pounds: ");
scanf("%f",&weight);//%f指示scanf从键盘读取一个浮点值,&weight指定将输入值赋给名为weight的变量中;
value=770*weight*14.5833;
printf("Your weight in rhodium is worth $%.2f. \n",value);//%f使用.2修饰词使浮点值显示到小数点后两位;
printf("You are easily worth that ! If rhodium prices drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}

3.2 变量与常量数据

有些数据可以在程序使用之前预先设定并在整个运行过程中没有变化,这称为常量;

另外的数据在程序运行过程中可能变化或被赋值,这称为变量。

变量与常量的区别在于,变量的值可以在程序执行中变化与指定,而常量则不可以。

3.3 数据类型关键字

C的数据关键字

原来的K&R关键字 C90添加2个关键字 C99添加3个关键字
int(基本的整数类型) signed(提供基本类型的变种) _Bool(布尔值)
long(提供基本类型的变种) void _Complex(复数)
short(提供基本类型的变种)   _Imaginary(虚数)
unsigned(提供基本类型的变种)    
char(表示字母及其他字符或者小的整数)    
float(带有小数点的数)    
double(带有小数点的数)    

这些类型可以按其在计算机中的存储方式划分为两个系列,即整数(integer)类型和浮点(floating-point)类型。

3.3.1 整数类型与浮点数类型

对于计算机而言,区别在于它们的存储方式。

3.3.2 整数

整数就是没有小数部分的数。

整数以二进制数字存储。

3.3.3 浮点数

浮点数差不多可以和数学中的实数概念相应。实数包含了整数之间的那些数。

加了小数点的数是浮点型值,所以7是整数,而7.00是浮点型。

浮点数与整数的存储方法不同,浮点数表示法将一个数分为小数部分和指数部分并分别存储。

整数和浮点数的区别:

*整数没有小数部分,而浮点数可以有小数部分;

*浮点数可以表示比整数范围大的多的数;

*对于一些大的算术运算,使用浮点数会损失更多的精度。

*因在任何区间内都存在无数个实数,所以计算机浮点数不能表示区域内所有的值。浮点数往往只是实际值的近似的值。

*浮点运算通常比整数运算慢。

3.4 数据类型

3.4.1 int 类型

C提供多种整数类型。

各种整数类型的区别在于所提供数值的范围,以及数值是否可以取负数。

int是有符号整数,即INT类型的值必须是整数,可以是正的、负的或者是0,其取值范围依赖于计算机系统。

一般的,int类型存储在计算机的一个字中。系统通过使用一个指示正负符号的位来表示有符号整数。

一、声明int变量

int关键字用于声明基本的整数变量。

可以直接赋值,也可以通过scanf()函数为变更赋值。

二、初始化变量

初始化(initialize)变量就是为变量赋一个初始值。

简言之,声明语句为变量创建、标定存储空间并为其指定初始值。

三、int类型常量

C把不含有小数点和指数的数作为整数。把大多数整数看作是Int类型。

四、打印int类型

%d说明符可以指示在一行中的什么位置打印整数。

记住,使用printf()函数时,格式说明符的数目和要显示的值的数目一定要相同。

五、八进制和十六进制

在C中,由专门的前缀表明是哪一种进制。ox或OX表示使用十六进制值,0表示使用八进制。

六、显示八进制和十六进制数

八进制说明符:%0;十六进制说明符:%x;

如果想显示C语言前缀,可以使用说明符%#0、%#x、%#X,要显示0和ox前缀,必须在说明符中加入#符号。

3.4.3 使用字符:char类型

char类型用于存储字母和标点符号之类的字符。但是技术实现上char却是整数类型。

这是因为char类型实际存储的是数字而不是字符。为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符。

c把一个字节(byte)定义为char类型使用的位(bit)数。

一、声明char类型变量

二、字符常量及其初始化

char broiled;

broiled='T';

如果不使用单引号,编译器会将T视为一个变更名;如果使用双引号,编译器将其初为一个字符串。

C将字符常量视为int类型而非char类型。

三、非打印字符

转义序列

给一个字符变量进行赋值时,转义序列必须用单引号括起来。

如果想用一个数值的八进制ASCII码代表它,可以在编码值前加一个反斜杠(\)并用单引号引起来。

beep='\007'

‘07’、‘7’、这种写法会使数值被解释为八进制。

关于转义序列的三个疑问

1、无论普通字符还是转义序列,如果作为双引号字符集合的一部分,则无需单引号。不在转义序列中的数字将像普通字符那样被打印出来。

2、如果要在某个转义序列和其对应的ASCII码之间做出选择,则应当使用转义序列。

3、当需要使用数值编码时,为什么使用'\032'而不是032?首先,'\032'能更清晰的表达程序员表示一个字符编码的意图;其次'\032'这样的转义序列可以嵌入到C字符串中,比如“Hello!\007\n”中就嵌入了'\007'.

四、打印字符

printf()使用%c说明符打印一个字符。

五、有符号还是无符号

根据C90标准,C允许在关键字char前使用signed和unsigned。这样使用字符类型处理小整数十分有用。

如果处理字符,则只须使用不带修饰词的标准char类型。

3.4.4 _Bool类型

_Bool类型由C99引入,用于表示布尔值。因为C用1表示true,用0表示false,所以_Bool类型实际上也是整数类型,只是原则上它仅需要1位来存储。

3.4.5 可移植的类型:inttypes.h

3.4.6 float、double、long double

C语言中的浮点数包括float\double\long double类型。

浮点数表示类似于科学记数法。

C标准规定,folat类型必须至少能表示6位有效数字,取值范围至少10的-37次方到10的37次方。

通常,系统使用32位存储一个浮点数。其中8位表示指数及其符号,24位用于表示非指数(称为尾数或有效数字)部分及其符号。

C还提供一种称为double(意为双精度)的浮点类型。

double类型和float类型具有相同的最小取值范围,但它必须最少能表示10位有效数字。

一般的,double使用64位而不是32位长度。

C提供第三种浮点类型long double,以满足比double类型更高的精度。不过C只保证long double类型至少同double类型一样的精确。

一、声明浮点变量

浮点变量的声明与初始化方法同整形变量相同。

二、浮点常量

一个浮点常量最基本的形式是:包含小数点的一个带符号的数字序列,接着是字母e或E,然后是代表10的指数的一个有符号值。

-1.56E+12

2.87e-3

可以省略正号。可以没有小数点(2E5)或指数部分(19.28),但不能同时没有两者。

可以省略纯小数部分(3.E16)或整数部分(.45E-6),但两者不能同时省略。

默认情况下,编译器将浮点常量当作double类型。

C使您可以通过f或F后缀使编译器把浮点常量当作folat类型,比如2.3f或9.11E9F。l或L后缀使一个数字成为long double类型,比如54.3l或4.32e4L,建议使用L。

没有后缀的浮点常量为double类型。

C99为表示新浮点常量添加了种十六进制格式。这种格式使用前缀ox或OX,接着是十六进制数字,然后是p或P(而不是E或e),最后是2的指数。

oxa.1fp10

三、打印浮点值

printf()函数使用%f格式说明符打印十进制记数法的float或double数字,用%e打印指数记数法的数字。

如果系统支持C99的十六进制格式浮点数,您可以使用a或A代替e或E。

打印long double类型,需要%Lf、%Le、%La说明符。

注意,float和double类型的输出都使用%f,%e、%a说明符。这是由于当它们向那些未在原型中显示说明参数类型的函数(如printf())传递参数时,C自动将float类型的参数转换为double类型。

四、浮点值的上溢和下溢

当计算结果是一个大得不能表达的数时,会发生上溢。

以十进制为例,把一个包含4位有效数字的数0.1234E-10除以10,将得到结果0.0123E-10,但是损失了一位有效数字,此过程称为下溢。

C将损失了类型精度的浮点值称为低于正常的。

3.4.7 复数和虚数

有3种复数类型:float_Complex  double_Complex 和 long double_Complex;

有3种虚数类型:float_Imaginary  double_Imaginary 和 long double_Imaginary;

如果您 包含了头文件complex.h,就可以用complex代替_Complex,用Imaginary代替_Imiginary.

3.4.8 其他数据类型

C从基本类型中衍生出其他数据类型,包括数据、指针、结构和联合。


3.4.9类型大小

C的内置运算符sizeof以字节为单位给出类型的大小。

3.5 使用数据类型

3.6参数和易犯的错误

注意,使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值。与之类似,使用%f显示int值也不会把该int值转换为浮点值。而且,参数数目的不足和类型不匹配所造成的结果也将随平台不同而不同。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!