【C】常见概念

计算机语言

  1. 计算机语言是人和计算机交流的工具,人们用它控制计算机完成相应操作
  2. 解释型语言在运行时由解释器逐行翻译并执行代码,开发调试方便但效率较低
  3. 编译型语言需通过编译器将源代码编译成机器语言,执行效率高但调试相对复杂
  4. 计算机语言的语句类型:空语句、表达式语句、函数调⽤语句、复合语句、控制语句
  5. 计算机语言排行榜:TIOBE

编译和链接

  1. 编译型计算机语言,需经编译器翻译然后链接器链接成可执行文件才可执行
  2. 编译器编译成的目标文件的后缀在 Linux 下是 .o,在 windows 下是 .obj
  3. 链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库
  4. 注释在预处理阶段被等价替换为空白字符(好的注释体现出程序员素质)

test.c 编译器
cl.exe add.c xxx.c test.obj add.obj xxx.obj 链接库 链接器
link.exe 可执行程序
xxx.exe


第一个程序

主函数

  1. 名称为 main 的函数是程序的唯一入口(有且只有一个)
  2. 包含标准库中相关库函数对应的头文件,才可以在链接时找到该库函数
  3. 函数 printf 会将数据写入到 stdout 缓冲区,当缓冲区触发刷新条件时输出
  4. 关键字 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;
}

标准缓冲区

  1. 通用缓冲区刷新条件:主动调用刷新函数、关闭流、程序正常退出
  2. 标准流包括:stdout(行缓冲)、stderr(始终无缓冲)、stdin(行缓冲)
  3. 普通文件流默认全缓冲,标准输入输出流重定向到文件或管道也为全缓冲
  4. 行缓冲与全缓冲在缓冲区满时会刷新,行缓冲遇换行符或联动情况也会刷新
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;
}

关键字

  1. 在计算机语言里,关键字(保留字)被编译器预设用于特定语法结构
  2. 九种控制语句形成三种结构:顺序结构、选择结构、循环结构
  3. 相关文档: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 获取所占字节数(平台差异)

字符

  1. 在键盘上敲出的符号是字符,这些字符遵循统一的编码(ASCII 编码)
  2. 字符是用单引号括起来的,字符串(以 '\0' 结尾)是用双引号括起来的
  3. ASCII 码是美国信息交换标准代码(使用 7 位二进制数来表示一个字符)
  4. 在这些字符中 ASCII 码值从 0~31 的是不可打印字符(无法打印观察)
  5. 顺序:数字 -> 大写字母 -> 小写字母
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

转义字符

  1. 转义字符顾名思义:即转变原来意思的字符
  2. 相关文档:Escape sequences
字符 解释
\a​ 警报字符,会触发系统发出提示音或警报信号
\b​ 退格符,将当前光标位置向左移动一字符位置
\f​ 换页符,使打印头移到下页头(输出为清屏或分页)
\n​ 换行符,将光标移到下一行的开头位置
\r​ 回车符,将光标移到当前行的开头位置
\t​ 水平制表符,将光标移到下一个水平制表位
\v​ 垂直制表符,将光标移到下一个垂直制表位
\\​ 反斜杠字符,用于在字符串或字符中表示反斜杠
\'​ 单引号字符,用于在字符常量中表示单引号
\"​ 双引号字符,用于在字符串常量中表示双引号
\?​ 问号字符,避免在书写连续问号时被误解为三字母词(现较少)
\0​ 空字符,在字符串中表示字符串的结束标志
\ooo​ 以 1 - 3 位八进制数表示的任意字符
\xhh​ 以 1 - 2 位十六进制数表示的任意字符

相关推荐
码农小韩10 小时前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
Q741_14710 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(2) 作答语言:C/C++ 哈夫曼编码 LRU
c语言·数据库·c++·算法·笔试·哈夫曼编码·哈夫曼树
你怎么知道我是队长10 小时前
C语言---位域
c语言·开发语言
爱吃生蚝的于勒13 小时前
【Linux】进程间通信之匿名管道
linux·运维·服务器·c语言·数据结构·c++·vim
!停13 小时前
C语言单链表
c语言·数据结构·算法
南行*13 小时前
C语言Linux环境编程
linux·c语言·开发语言·网络安全
你怎么知道我是队长13 小时前
C语言---printf函数使用详细说明
c语言·开发语言
消失的旧时光-194314 小时前
函数指针 + 结构体 = C 语言的“对象模型”?——从 C 到 C++ / Java 的本质统一
linux·c语言·开发语言·c++·c
代码游侠14 小时前
学习笔记——ESP8266 WiFi模块
服务器·c语言·开发语言·数据结构·算法
Felven1 天前
A. Helmets in Night Light
c语言