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