计算机语言
- 计算机语言是人和计算机交流的工具,人们用它控制计算机完成相应操作
- 解释型语言在运行时由解释器逐行翻译并执行代码,开发调试方便但效率较低
- 编译型语言需通过编译器将源代码编译成机器语言,执行效率高但调试相对复杂
- 计算机语言的语句类型:空语句、表达式语句、函数调⽤语句、复合语句、控制语句
- 计算机语言排行榜:TIOBE
编译和链接
- 编译型计算机语言,需经编译器翻译然后链接器链接成可执行文件才可执行
- 编译器编译成的目标文件的后缀在 Linux 下是 .o,在 windows 下是 .obj
- 链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库
- 注释在预处理阶段被等价替换为空白字符(好的注释体现出程序员素质)
test.c 编译器
cl.exe add.c xxx.c test.obj add.obj xxx.obj 链接库 链接器
link.exe 可执行程序
xxx.exe
第一个程序
主函数
- 名称为 main 的函数是程序的唯一入口(有且只有一个)
- 包含标准库中相关库函数对应的头文件,才可以在链接时找到该库函数
- 函数 printf 会将数据写入到 stdout 缓冲区,当缓冲区触发刷新条件时输出
- 关键字 return 会将后面的值返回给调用处(具体返回类型取决于函数头)
c
复制代码
#include <stdio.h>
#include <string.h>
// 宏定义判断
#ifdef WIN32
#include <Windows.h>
#endif
/* argc: 命令行参数数量,argv: 参数字符串,envp: 环境变量字符串 */
int main(int argc, char* argv[], char* envp[])
{
// 设置输入输出编码
#ifdef WIN32
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
#endif
// 转义字符效果
char str[] = "c:\test\130\test.c";
printf("c:\\test\\130\\test.c\n");
// 计算大小与长度
printf("len: %zu\n", strlen(str));
printf("size: %zu\n", sizeof str);
return 0;
}
标准缓冲区
- 通用缓冲区刷新条件:主动调用刷新函数、关闭流、程序正常退出
- 标准流包括:stdout(行缓冲)、stderr(始终无缓冲)、stdin(行缓冲)
- 普通文件流默认全缓冲,标准输入输出流重定向到文件或管道也为全缓冲
- 行缓冲与全缓冲在缓冲区满时会刷新,行缓冲遇换行符或联动情况也会刷新
cpp
复制代码
#include <stdio.h>
#ifdef _WIN32
#include <windows.h>
void sleep_sec(int sec)
{
Sleep(sec * 1000);
}
#else
#include <time.h>
void sleep_sec(int sec)
{
struct timespec ts = { sec, 0 };
nanosleep(&ts, NULL);
}
#endif
int main()
{
// 手动刷新
printf("fflush");
fflush(stdout);
sleep_sec(1000);
// 无缓冲特性
fprintf(stderr, "Error!");
sleep_sec(1000);
// 输入联动刷新
char ch = 0;
printf("scanf");
scanf("%c", &ch);
sleep_sec(1000);
return 0;
}
关键字
- 在计算机语言里,关键字(保留字)被编译器预设用于特定语法结构
- 九种控制语句形成三种结构:顺序结构、选择结构、循环结构
- 相关文档:C keywords
| 关键字 |
作用 |
| _Bool |
声明布尔变量(C99) |
| char |
声明字符变量 |
| short |
修饰整型 |
| int |
声明整型变量 |
| float |
声明单精度浮点型变量 |
| double |
声明双精度浮点型变量 |
| long |
修饰数据类型 |
| signed |
有符号的修饰 |
| unsigned |
无符号的修饰 |
| static |
静态的修饰(增局部限全局) |
| volatile |
易变的修饰(阻止编译器优化) |
| const |
常变量修饰 |
| void |
表无类型(函数相关) |
| enum |
声明枚举类型 |
| struct |
声明结构体 |
| union |
声明共用体 |
| auto |
自动存储期修饰 |
| register |
建议编译器存寄存器 |
| typedef |
为已有类型定义别名 |
| if ... if else ... else |
依据条件判断执行 |
| switch ... case ... default |
依据对应值跳转 |
| for / while |
先判断条件再执行 |
| do ... while |
先执行再判断条件 |
| break |
跳出循环或 switch |
| continue |
直接跳到循环头 |
| goto |
跳转到指定标签 |
| inline |
建议编译器将函数展开(C99) |
| return |
从函数返回值并退出函数 |
| extern |
声明外部标识符(多文件共享) |
| sizeof |
获取所占字节数(平台差异) |
字符
- 在键盘上敲出的符号是字符,这些字符遵循统一的编码(ASCII 编码)
- 字符是用单引号括起来的,字符串(以 '\0' 结尾)是用双引号括起来的
- ASCII 码是美国信息交换标准代码(使用 7 位二进制数来表示一个字符)
- 在这些字符中 ASCII 码值从 0~31 的是不可打印字符(无法打印观察)
- 顺序:数字 -> 大写字母 -> 小写字母
| dec |
字符 |
dec |
字符 |
dec |
字符 |
dec |
字符 |
dec |
字符 |
| 0 |
NUL (空) |
26 |
SUB |
52 |
4 |
78 |
N |
104 |
h |
| 1 |
SOH (标题开始) |
27 |
ESC |
53 |
5 |
79 |
O |
105 |
i |
| 2 |
STX (正文开始) |
28 |
FS |
54 |
6 |
80 |
P |
106 |
j |
| 3 |
ETX (正文结束) |
29 |
GS |
55 |
7 |
81 |
Q |
107 |
k |
| 4 |
EOT (传送结束) |
30 |
RS |
56 |
8 |
82 |
R |
108 |
l |
| 5 |
ENQ (询问) |
31 |
US |
57 |
9 |
83 |
S |
109 |
m |
| 6 |
ACK (确认) |
32 |
(空格) |
58 |
: |
84 |
T |
110 |
n |
| 7 |
BEL (响铃) |
33 |
! |
59 |
; |
85 |
U |
111 |
o |
| 8 |
BS (退格) |
34 |
" |
60 |
< |
86 |
V |
112 |
p |
| 9 |
HT (横向制表) |
35 |
# |
61 |
= |
87 |
W |
113 |
q |
| 10 |
LF (换行) |
36 |
$ |
62 |
> |
88 |
X |
114 |
r |
| 11 |
VT (纵向制表) |
37 |
% |
63 |
? |
89 |
Y |
115 |
s |
| 12 |
FF (换页) |
38 |
& |
64 |
@ |
90 |
Z |
116 |
t |
| 13 |
CR (回车) |
39 |
' |
65 |
A |
91 |
|
117 |
u |
| 14 |
SO (移位输出) |
40 |
( |
66 |
B |
92 |
\ |
118 |
v |
| 15 |
SI (移位输入) |
41 |
) |
67 |
C |
93 |
] |
119 |
w |
| 16 |
DLE |
42 |
* |
68 |
D |
94 |
^ |
120 |
x |
| 17 |
DC1 |
43 |
+ |
69 |
E |
95 |
_ |
121 |
y |
| 18 |
DC2 |
44 |
, |
70 |
F |
96 |
|
122 |
z |
| 19 |
DC3 |
45 |
- |
71 |
G |
97 |
a |
123 |
{ |
| 20 |
DC4 |
46 |
. |
72 |
H |
98 |
b |
124 |
| |
| 21 |
NAK |
47 |
/ |
73 |
I |
99 |
c |
125 |
} |
| 22 |
SYN |
48 |
0 |
74 |
J |
100 |
d |
126 |
~ |
| 23 |
ETB |
49 |
1 |
75 |
K |
101 |
e |
127 |
DEL (删除) |
| 24 |
CAN |
50 |
2 |
76 |
L |
102 |
f |
|
|
| 25 |
EM |
51 |
3 |
77 |
M |
103 |
g |
|
|
转义字符
- 转义字符顾名思义:即转变原来意思的字符
- 相关文档:Escape sequences
| 字符 |
解释 |
| \a |
警报字符,会触发系统发出提示音或警报信号 |
| \b |
退格符,将当前光标位置向左移动一字符位置 |
| \f |
换页符,使打印头移到下页头(输出为清屏或分页) |
| \n |
换行符,将光标移到下一行的开头位置 |
| \r |
回车符,将光标移到当前行的开头位置 |
| \t |
水平制表符,将光标移到下一个水平制表位 |
| \v |
垂直制表符,将光标移到下一个垂直制表位 |
| \\ |
反斜杠字符,用于在字符串或字符中表示反斜杠 |
| \' |
单引号字符,用于在字符常量中表示单引号 |
| \" |
双引号字符,用于在字符串常量中表示双引号 |
| \? |
问号字符,避免在书写连续问号时被误解为三字母词(现较少) |
| \0 |
空字符,在字符串中表示字符串的结束标志 |
| \ooo |
以 1 - 3 位八进制数表示的任意字符 |
| \xhh |
以 1 - 2 位十六进制数表示的任意字符 |