c primer plus阅读 (cprimerplus的读书笔记)

为什么阅读《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; 一条语句最简单的语句是空语句:; //空语句

类型转换

  1. 升级转换,两种类型的运算,两个值被分别转换成两种类型的更高级别。
  2. 类型的级别高到低:long double、double、float、unsigned long long 、long long 、unsigned long 、long、unsigned int、int。
  3. 赋值表达式语句中,计算的结果会被转换成被赋值变量的类型。
  4. 当作为函数参数传递时,char和short被转换成int,float转换成dobule
  5. 浮点值转换成整数类型,原来的浮点值会被截断。

强制类型转换运算符

mice = 1.6 + 1.7;
mice = (int)1.6 + (int)1.7;