第3章 数据和C

学习笔记——《C Primer Plus》

程序离不开数据。把数字、字母和文字输入电脑,就是希望它利用这些数据完成某些任务。

3.1 示例程序

#include <stdio.h>
int main(void)
{
	float weight;  //声明一个体重变量
	float value;   //相等重量的白金价值
	
	printf("Are you worth your weight in platinum?\n");
	printf("Let's check it out.\n"); 
	printf("Please enter your weight in pounds:");
	
	//获取用户输入
	scanf("%f",&weight);
	//假设白金的价格是每蛊司$1700 
	//14.5833用于把英镑常衡蛊司转换为金衡蛊司
	value = 1700.0 * weight * 14.5833;
	printf("Your weight in platinum is worth $%.2f.\n",value);
	printf("You are easily worth that! If platinum prices drop,\n"); 
	printf("eat more to maintain your value.\n");
	
	return 0;
}

即使输入正确无误,编译器也可能给出一些警告,如“警告:从double类型转变成float类型可能会丢失数据”。错误(error)信息表明程序中有错,不能进行编译。而警告(warning)表明尽管编写代码有效,但可能结果不是我们想要的,警告不会终止编译。

3.1.1 程序中的新元素

(1)浮点数据类型(float)的变量,比整数型(int)的变量表示的范围更大。float类型可以储存带小数的数字。
(2)在printf()中使用 %f 来处理浮点值。%.2f 中的 .2 用于精确控制输出,指定输出的浮点数只显示小数点后面两位。
(3)scanf()函数用于读取键盘的输入。%f 说明 scanf() 要读取用户从键盘输入的浮点数,&weight 告诉 scanf() 把输入的值赋给weight 变量。scanf() 函数使用 & 符号找到 weight 变量的地点。

3.2 变量与常量数据

在程序的指导下,计算机可以做很多事情,如数值计算、名字排序、执行语言等事情。要完成这些任务,程序需要使用数据,即承载信息的数字和字符。
有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这称为常量(constant)。
在程序运行期间可能会改变或被赋值,这称为变量(variable)。
在实例代码中:weight 是一个变量,14.5833 是一个常量。

3.3 数据:数据类型关键字

在C语言中,用 int 关键字表示基本的整数类型;char关键字用于指定字母和其他字符(如,#、$、% 和 * );_Bool类型表示布尔值( true 和 false );_Complex表示复数;_Imaginary表示虚数。
按计算机的储存方式可分为两大基本类型:整数类型和浮点数类型。

位(bit):最小的存储单元,可以储存0或1。位是计算机内存的基本构建块。
字节(byte):是常用的计算机存储单位,1字节均为8位。既然1位可以表示0或1,那么8位就有256(2的8次方)种可能的0、1组合。通过二进制编码,便可表示0~255的整数或一组字符。
字(word):是设计计算机时给定的自然存储单位,个人计算机字长有32位,64位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。

3.3.1 整数

在C语言中,整数是没有小数部分和指数部分的数。计算机以二进制数字储存整数,例如,整数7以二进制写是111。因此,要在1字节中储存该数字,需要把前5位都设置成0,后3位设置成1:
在这里插入图片描述

3.3.2 浮点数

2.75、3.16E7、7.00 和 2e-8 都是浮点数。如 3.16E7 表示 3.16 × 10^7 ( 3.16 乘以 10 的 7 次方)。
计算机把浮点数分成小数部分和指数部分来表示,而且分开储存这两部分。
在十进制下,可以把 7.00 写成 0.7E1。这里 0.7 是小数部分, 1 是指数部分。当然,计算机在内部使用二进制和 2 的幂进行储存。

  • 整数没有小数部分,浮点数有小数部分。
  • 浮点数可以表示的范围比整数大。
  • 对于一些算术运行(如,两个很大的数相减),浮点数损失的精度更多。

在这里插入图片描述

3.4 C语言基本数据类型

3.4.1 int 类型

int 类型的值必须是整数,可以是正整数、负整数或零。
ISO C规定 int 的取值范围最小为 -32768 ~ 32767

1. 声明int变量
int erns;
int hogs, cows, goats;
//赋值
cows = 112;
2. 初始化变量

初始化(initialize)变量就是为变量赋一个初始值。在C语言中,初始化可以在声明中完成。

int hogs = 21;
int cows = 32, goats = 14;
int dogs, cats = 94  //有效,但是这种格式很糟糕

最好不要把初始化的变量和未初始化的变量放在同一条声明中。
简而言之,声明为变量创建和标记存储空间,并为其指定初始值:
在这里插入图片描述

3. 打印int值

%d 称为转义说明,%d 指明了在一行中打印整数的位置;
要确保转义说明的数量与待打印值的数量相同。

4. 八进制和十六进制

八进制和十六进制计数很方便,因为 8 和 16 都是 2 的幂。

十六进制数的每一位数恰好由4位二进制数表示。例如:十六进制数 3 的二进制数是 0011,十六进制数 5 的二进制数是 0101。因此,十六进制数 35 的位组合是 00110101,十六进制数 53 的位组合是 01010011。

在C语言中,0x0X 前缀表示十六进制值;0 前缀表示八进制。
使用不同的进制数是为了方便,不会影响数被储存的方式,因为计算机内部都是以二进制进行编码。

5. 显示八进制和十六进制

%0 显示八进制数字
%x 显示十六进制数字
如果要在八进制和十六进制值前显示 00x 前缀,要分别在转换说明中加入 #

3.4.2 使用字符:char 类型

char 类型用于储存字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为 char 类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。
最常用的编码是ASCII编码。如在ASCII码中,整数 65 代表大写字母 A。因此,储存字母 A 实际上储存的是整数 65。
标准ASCII码的范围是 0 ~ 127,只需7位二进制数即可表示。通常,char类型被定义为8位的储存单元。

1. 声明char类型变量
char response;
char itable, latan;
2.字符常量和初始化

如果要把一个字符常量初始化为字母 A ,不必背ASCII码。

char grade = 'A';

单引号括起来的单个字符被称为字符常量(character constant)。
双引号括起来的字符集合被称为字符串(string)。
用 ‘A’ 代替 65 才是较为妥当的做法,最好使用字符常量,而不是数字代码值。

char grade = 65;  //对于ASCII,这样做没问题,但这是一种不好的编程风格。

把转义序列赋给字符变量时,必须用单引号把转义序列括起来。

char nerf = '\n';

注意数字和数字字符的区别。例如,字符 4 对应的ASCII码是 52 。‘4’ 表示字符 4 ,而不是数值 4 。

3. 打印字符

printf() 函数用 %c 指明待打印的字符。
如果用 %d 转换说明打印 char 类型变量的值(ASCII码),打印的是一个整数。而 %c 转换说明告诉 printf() 打印该整数对应的字符。

#include <stdio.h> 
int main()
{
	char ch;
	
	printf("Please enter a character.\n");
	scanf("%c",&ch);
	printf("The code for %c is %d.\n",ch,ch);
	
	return 0;
}

输出结果:
在这里插入图片描述
printf() 函数中的转换说明决定了数据的显示方式,而不是数据的储存方式:
在这里插入图片描述

3.4.3 _Bool 类型

用于表示布尔值,即逻辑值 true 和 false。因为C语言用值 1 表示 true,值 0 表示 false,所以_Bool类型实际上也是一种整数类型。
但原则上它仅占用 1 位存储空间,因为对于 0 和 1 而言,1 位的存储空间足够了。

3.4.4 float 、double 和 long double

各种整数类型对于大多数软件开发项目而言够用了。然而,面向金融和数学的程序经常使用浮点数。
浮点数的表示类似于科学计数法(即使用小数乘以 10 的幂来表示数字)。
通常,系统储存一个浮点数要占用 32 位。其中 8 位用于表示指数的值和符号,剩下 24 位用于表示非指数部分(也叫尾数或者有效数)及其符号。

C语言提供的另一种浮点类型是 double(双精度)。double 类型至少能表示 10 位有效数字,而 float 至少能表示 6 位有效数字。

1. 声明浮点类型变量

浮点变量的声明和初始化方式与整型变量相同:

float noch, jonah;
double trouble;
float planck = 6.63e - 34;
long double gnp;
2. 浮点型常量

书写浮点型常量的形式有多种,浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟 e 或 E,最后是一个有符号数表示 10 的指数。

-1.56E+12
2.87e-3

正号可以省略。可以没有小数点(如,2E5)或没有指数部分(如19.28),但不能同时省略两者。可以省略小数部分(如,3.E16)或整数部分(如,.45E-6),但是不能同时省略两者。
不能爱浮点常量中间加空格

没有后缀的浮点型常量是 double 类型。在浮点数后面加上 f 或 F 后缀,编译器会将浮点型常量看作 float 类型,如 2.3f 和 9.11E9F。

3.打印浮点值

printf() 函数使用 %f 转换说明打印十进制计数法的 float 和 double 类型浮点数,用 %e 打印指数计数法的浮点数。
注意:sanf() 函数中float%fdouble%lf

3.4.5 类型大小

sizeof() 是C语言的内置运算符,以字节为单位给出指定类型的大小。%zd 转换说明匹配 sizeof() 的返回类型。一些不支持C99 和 C11 的编译器可用 %u%lu

#include<stdio.h> 
int main(void)
{
	printf("Type int has a size of %u bytes.\n",sizeof(int));
	printf("Type double has a size of %lu bytes.\n",sizeof(double));
	printf("Type char has a size of %zd bytes.\n",sizeof(char));
	
	return 0;
}

3.5 使用数据类型

在使用变量之前必须先声明,并选择有意义的变量名。初始化变量应使用与变量类型匹配的常数类型。

int apples = 3;    //正确
int oranges = 3.0; //不好的形式

把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部分数据丢失。

int cost = 12.99; //用 double 类型的值初始化 int 类型的变量
float pi = 3.1415926536;  //用 double 类型的值初始化 float 类型的变量

第一个声明,cost的值是 12 。C编译器打浮点数转换成整数时会直接丢弃(截取)小数部分,而不进行四舍五入。
第二个声明会损失一些精度,因为C只保证了 float 类型前6位的精度。

许多程序员和公司内部都有系统化的命名约定,在变量名中体现其类型。例如,用 i_ 前缀表示 int 类型,如这样一眼就能看出 i_smart 是 int 类型的变量。

3.6 参数和陷阱

传递给函数的信息被称为参数。
例如,printf(“Hello,pal”); 函数调用有一个参数:“Hello,pal”。双引号中的字符序列被称为字符串(string)。
关键要理解无论双引号中包含多少个字符和标点符号,一个字符串就是一个参数。
于此类似,scanf( “%d”, &weight) 函数调用有两个参数:"%d" 和 &weight。C语言用逗号分隔函数中的参数。
printf() 和 scanf() 函数用第一个参数表明后续有多少个参数,即第一个字符串中的转换说明和后面的参数分别对应。

3.7 刷新输出

printf() 何时把输出发送到屏幕上??? 最初,printf() 语句把输出发送到一个叫作缓冲区(buffer)的中间存储区域。C标准明确规定了何时把缓冲区中的内容发送到屏幕:当缓冲区满、遇到换行字符或需要输入的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)。
如,前面的 printf() 语句既没有填满缓冲区,也没有换行符,但如果下一条是 scanf() 语句,要求用户输入,这就迫使 printf() 的输出被发送到屏幕上。

3.8 编程练习

点击链接:
link.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值