计算机语言
- 计算机语言是人和计算机交流的工具,人们用它控制计算机完成相应操作
- 解释型语言在运行时由解释器逐行翻译并执行代码,开发调试方便但效率较低
- 编译型语言需通过编译器将源代码编译成机器语言,执行效率高但调试相对复杂
- 计算机语言的语句类型:空语句、表达式语句、函数调⽤语句、复合语句、控制语句
- 计算机语言排行榜: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 位十六进制数表示的任意字符 |