C语言笔记

字数 597 · 2018-06-06

#c

Hello World

1
2
3
4
5
6
#include <stdio.h>

int main(void){
    printf("Hello World\n");
    return 0;
}

Hello World 详解

1
#include <stdio.h>

第一行相当于把 stdio.h 中所有的内容复制到#include 出现的位置上。
使用 #include 可以很方便的共享常见的代码。

#include 是一个常见的预处理指令,通常,C编译器会在编译前做一些准备工作,也就是所谓的预处理。
stdio.h 是编译器Package的一部分,里面包含了输入输出函数的相关信息。

1
int main(void)

第二行,在C语言编写的程序中,main 函数永远是最先执行的。main 函数的返回值将返回给操作系统。

……

注释

单行注释

1
// Here is a comment confined to one line.

多行注释

1
2
3
/* 
a simple program
 */

函数原型

C标准建议为每个函数提供函数原型(function prototypes)

debugger

A debugger is a program that enables you to run another program step-by-step and examine the value of that program’s variables.

关键字

一些不认识的关键字:
auto enum restrict extern volatile static inline register unoin

数据类型

相关关键字
int, short, long, unsigned, char, float, double, _Bool, _Complex, _Imaginary

1
2
3
4
// 打印 8进制数和 16进制数
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);
1
2
dec = 100; octal = 144; hex = 64
dec = 100; octal = 0144; hex = 0x64
1
2
3
4
5
6
7
8
9
10
// 一些组合类型
long int estine;
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago;

使用整形常量时,编译器会选择当前足够的类型,如数字2345,它小于int的最大范围,所以选择int为它的类型。
可以使用一些后缀来强制使用更多位的数据类型,如 7L, 2LL,3ULL

printf 使用前缀 l 表示一个长类型,使用前缀 h 表示短类型,如 %ld 表示一个 long 类型,%hd 表示一个 short 类型。

可移植的类型 inttypes.h,可以使用 int16_t uint32_t 来精确的描述整数类型。
inttypes.h 还提供可其他的一些类型,如: int_least8_t int_fast8_t

1
2
3
4
5
6
7
8
// stdint.h 源码片段
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char		int8_t;
typedef short int		int16_t;
typedef int			int32_t;
# if __WORDSIZE == 64
typedef long int		int64_t;

_Bool

C 使用1代表true,0代表false。
_Bool 实际上是一个整形。它至占用1bit的内存。

编译器

编译的工作是将高级语言转换成机器语言。C 编译器也会把 C库 的代码合并到你的代码中。(更准确的说是Linker完成了这个工作)。编译器还好确认你的代码是否合法。

编译和链接

编译器把源文件转化为机器码,将结果放在一个 .o 文件里。虽然这个文件里都是机器码,但它并不是一个完整的程序,所以也无法执行。第一个缺失的元素是启动码 startup code, 启动码是程序和操作系统的桥梁。第二个缺失的元素是库代码,这些代码存储在另外的文件里,我们称它们为库(library)。一个库文件包含了许多函数的机器码。

链接器负责将你的对象码,启动码,库代码合并到一个文件中,这个最终的文件就是一个可执行文件。对于库代码,链接器只提取你用到的部分。

编译链接

计算机是如何工作的

CPU负责运算,内存负责加载程序和数据,硬盘负责存储。
CPU的工作非常简单,它从内存读取一条指令并执行,接着读取下一条指令执行,并一直这样下去。
CPU也有自己的工作间,它由一些寄存器组成,每个寄存器可以存储一个数字。其中的一个寄存器存储下一条指令的内存地址。
……

C语言的结构

结构

philosophy

avoid carry unnecessary weight