C Primer Plus 第三章读书笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

上一章主要介绍了一些基础的概念,相当于给我们了解一下C涉及到知识的简单分类,这一章将会涉及更多的关键字、运算符、函数和数据类型


一、示例程序

/* plateinum.c -- your weight in platinum */
#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 wehght 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;
}

首先还是从示例程序来看,这是一个很有想法的程序,计算人的体重转换成等质量铂金的价值,瞬间感觉自己变得有“价值”了。
关于转换公式,这与我们编程无关,直接使用即可,我们现在看看这段代码有什么新的成分:

1.浮点型(数据类型)

	float weight;/* 你的体重 */
	float value;/* 相等重量的白金价值 */

从代码形式和注释来看,不难发现这个float和前一章所见到的int应当属于同一类知识,事实也确实如此,它也是数据类型的一种,叫浮点型,更准确地说,是单精度浮点型,那么问题来了,整型一听就知道是整数类型,那么浮点是个什么呢,我们先来思考一下,前面说这个程序是用来转换人的体重为等质量铂金的价值,那么日常生活中不论是人的体重还是转化比例,都显然不可能保持在一个整数范围,而且在单位变化时,即使是一个整数也可能出现“小数点”,于是浮点型的含义就明朗了,简单来说,可以理解为广义上的带小数点的数,那么这里有一个小问题,我们知道计算机是利用二进制进行数据储存,那这个浮点型的小数部分是否真的精确呢?答案是否定的,事实上大多数小数不能被浮点型准确的表示出来,因为浮点型在储存是采用的是2的多少次幂的形式,所以在小数部分不能拆分成0.5、0.25、0.125等这种准确的2的负几次幂相加的形式时,这个浮点数的表示就会有误差,尽管这个误差很小很小,但在涉及到精度极高的计算时,会出现致命的问题,不过现阶段学习不涉及这类问题,仅作了解即可。

2.输入语句scanf

/* 获取用户的输入 */
	scanf("%f", &weight);

我们看到这一行多出了一个scanf语句,它的形式类似于printf,两者之间是否有什么联系呢?答案是肯定的,printf是输出,scanf即输入,在利用代码解决实际生活中的很多问题时,我们并不是一开始就能得到所有需要的数据的,因此输入语句的存在是必然的,它的作用也很好理解,就是从读取我们从键盘输入的数据然后给到预先设置好的变量,需要注意与输出不同的在于变量weight前多了一个&符号,这是取地址符,因为显然设置这个变量和输入并不是同时进行的,所以这个变量保存时会有一个地址,关于地址的具体含义暂不做过多解释,简单理解为变量所处的位置即可,scanf就是通过地址把我们输入的值准确的给到预先设置好的变量的,所以输入时取地址符至关重要,千万不能忘记。

二、变量与常量数据

这里补充一个点,变量顾名思义是会变化的量,与之对应就有常量,即不变的量,在后面的学习中,我们会逐渐意识到常量的重要性。

三、数据:数据类型关键字

如今我们对数据类型有了一定的了解,而这部分是让我们对数据类型的理解更加系统化,在此之前我们先需要知道一个知识:

1.位、字节

位、字节是描述计算机数据单元或储存单元的术语,此处主要指存储单元。
位最小储存0或1(因为计算机数据都是以二进制存储),8位组成1字节从二进制的角度不难知道1字节可以表示的二进制数范围是0-255。

1.整数

前面说过整数的概念和我们所理解的类似,就是没有小数部分的数,在计算机中整数类型是以8位字节二进制存储的.

(注意:此处不是说整型是占8个字节,而是表示整型的每个字节有8位,实际上整型占4字节)

2.浮点数

浮点数类似于实数概念,前面说小数主要是为了体现它的特殊之处,如果想用浮点型表示整数当然也是可以的。浮点数存储方式不同于整数,浮点数是以科学计数法(即指数)方式存储的,例如说3.14e7相当于3.14乘10七次方,那么在存储它时会将符号,前面的3.14和后面的指数7分别存储,当然计算机中一般是以2的幂存储而不是10。

(注意:虽然单精度浮点数float也占4字节,但因为存储方式的不同,其所表示的数的范围比整数int要大得多,双精度浮点数double占8字节则更大)

四、C语言基本数据类型

1.int类型

前面已经介绍了int类型,通常其能表示的数的范围介于-32768~32767之间,而第一位用来表示符号(0为负,1为正)。

2.其他显示方式

显示八进制和十六进制:前面也说到与之对应的占位符是%d,但这是因为我们通常习惯用十进制显示一个数字,而如果在一些特殊情况下需要用八进制和十六进制显示,则占位符需要调整为%o和%x,而#作用则是显示前缀o(八进制)和ox(十六进制),因为除了16进制超过十的数用字母表示外,其他我们无法分辨它到底是什么进制,下面是书上的一段示例代码:

/* bases.c--以十进制、八进制、十六进制打印十进制数100 */
#include<stdio.h>
int main(void)
{
	int x = 100;
	printf("dec = %d;octal = %o; hex = %x\n", x, x, x);
	printf("dec = %d;octal = %#o; hex = %x\n", x, x, x);

	return 0;
}

3.其他整数类型

上面所说是最常规的整型,为了实际情况需要,通常还会涉及到其他整型:
short int (占用空间更小,表示范围更校的整型)
unsigned int(无符号整型)可表示0~65535
long int(占用空间更大,表示范围更大的整型)
long long int(至少占用64位,表示范围比long int更大)`

/* print2.c--更多 printf() 的特性 */
#include<stdio.h>
int main(void)
{
	unsigned int un = 3000000000;/* int 为32位和short为16位的系统 */
	short end = 200;
	long big = 65537;
	long long verybig = 12345678908642;

	printf("un = %u and not %d\n", un, un);
	printf("end = %hd and %d\n", end, end);
	printf("big = %ld and not %hd\n", big, big);
	printf("verybig = %lld and not %ld\n", verybig, verybig);

	return 0;
}

这是书上的示例代码,可以看到除了占位符的区别,其他使用规则和与常规整型一致。

4.使用字符:char类型

字符型从直观上来看就是我们所说的英文字母和一些标点符号,但从本质上它是属于整数类型,因为计算机实际上是利用实现特定的ASCII码来表示字符,现有的ASCII码范围是0~127,对应着128个不同字符。值得注意的是在定义字符变量,给其赋值时,需要给字符加上单引号,或是直接以它对应的ASCII码赋值,不过一般不常用的字符我们不会可以记忆他的ASCII码,况且对于不同的编码器也可能使用的不是ASCII码,使用一般不采取后者。

5.非打印字符

非打印字符就是指一些代表行为的字符或者有特殊作用一般不会打印的字符,下面是书中列举的一些例子:

转义序列含义
\a警报
\b退格
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\ \反斜杠
\ ’单引号
\ ‘’双引号
\ ?问号
\0oo八进制值
\xhh十六进制值

6._Bool类型

用于表示布尔值,简单来说就是逻辑的真假,0为假,理论上非0均为真,不过一般我们用1表示真。

总结

本章中还涉及到其他类型,例如复数和虚数类型,不过我至今感觉涉及不多,我认为在具体问题遇到时再做了解也未尝不可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值