为什么阅读《C Primer Plus》第六版
准备好好研究下redis源码,但是很久没用c语言写代码了,平时工作主要用java和js。
所以准备重新阅读学习下c语言经典书籍:C Primer Plus。
更好的阅读redis源码。
第4章 字符串和格式化输入/输出
前导程序
// talkback.c -- 演示与用户交互
#include <stdio.h>
#include <string.h> // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main()
{
float weight, volume;
int size, letters;
char name[40]; // name是一个可容纳40个字符的数组
printf("Hi! What's your first name?\n");
scanf("%s", name);
printf("%s, what's your weight in pounds?\n", name);
scanf("%f", &weight);
size = sizeof(name);
letters = strlen(name);
volume = weight / DENSITY;
printf("Well, %s, your volume is %2.2f cubic feet.\n",
name, volume);
printf("Also, your first name has %d letters,\n",
letters);
printf("and we have %d bytes to store it.\n", size);
return 0;
}
运行输出
Hi! What's your first name?
Christine
Christine, what's your weight in pounds?
154
Well, Christine, your volume is 2.47 cubic feet.
Also, your first name has 9 letters,
and we have 40 bytes to store it.
- 采用数组array存储字符串, char name[40]该数组占用内存中40个连续的字节,每一个字节存储一个字符值。
- %s处理字符串的输入和输出。 注意:&weight有&,name没有。
- C预处理器把字符常量DENSITY定义为62.4。
- strlen()获取字符串的长度。需要#include <string.h>
字符串简介
字符串是一个或多个字符的序列: "Helo World!!"
c语言用char类型的数组保存字符串,通过字符\0标记字符串的结束。
所以40个存储单元,实际只能存储39个字符大小。
所以"x"和'x'的区别: "x"实际上由两个字符组成:'x'和\0
char name[40];
name = "Serendipity"
strlen -> 11, 空字符不计入
sizeof -> 40
常量和C预处理器
3.14159 * d , pi * d
变量名比数字表达的信息更多
多处使用,改动也方便。
支持 float pi;
pi = 3.14159;
但是变量容易被误改,通过C预处理器:
#define pi 3.14159
编译程序时候,所有pi都会替换成3.14159
注意末尾不加分号。
C90标准新增了const关键字,限定变量为只读。
const int MONTHS = 12; //MONTHS不可更改,值为12
printf()和scanf()
scanf函数每次读取一个字符,跳过所有的空白字符,
直至遇到第一个非空白字符,如果是%s,会直到遇到下一个空白结束。
scanf("%d,%d",&n,&m);
用户将输入一个数字、一个逗号、再输入一个数字。
printf和scanf第一个参数中的转换说明必须与后续参数中的值相匹配。
可以使用转换说明控制输出的外观:字段宽度、小数位和字段内的布局。
第5章 字符串和格式化输入/输出
和java一样的就不记了。
sizeof和size_t
sizeof运算符以字节为单位返回运算对象的大小,
size_t是语言定义的标准类型,
C的typedef机制
typedef double real;
real就是double的别名。
可以声明real deal;
++运算符
a_post = a++; //使用a值之后,递增a
pre_b = ++b; //使用b值之前,递增b
不要自作聪明,一次用太多运算符,自己都会糊涂。
表达式和语句
legs = 4 表达式
legs = 4; 一条语句
最简单的语句是空语句:
; //空语句
类型转换
- 升级转换,两种类型的运算,两个值被分别转换成两种类型的更高级别。
- 类型的级别高到低:long double、double、float、unsigned long long 、long long 、unsigned long 、long、unsigned int、int。
- 赋值表达式语句中,计算的结果会被转换成被赋值变量的类型。
- 当作为函数参数传递时,char和short被转换成int,float转换成dobule
- 浮点值转换成整数类型,原来的浮点值会被截断。
强制类型转换运算符
mice = 1.6 + 1.7;
mice = (int)1.6 + (int)1.7;