Your Site Title

C

标准: ISO/IEC 9899:年份(89, 90, 95, 99, 11, 18)

C是一门流行的语言, 融合了计算机科学理论和实践的控制特性. C语言的设计理念让用户 能轻松地完成自顶向下的规划, 结构化编程和模块化设计. 因此, 用C语言编写的程序更易 懂, 更可靠.

C - Quick Guide

C程序一直由下列部分组成:

1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。

Void

  1. Function returns as void - 表示没有返回值
  2. Function arguments as void - 表示没有参数
  3. Pointers to void - 表示没有类型, 就是任何类型

declaration, definition, initialization

extern int a ; // 声明变量, 可以声明多次
int a ; // 定义变量(会分配内存在栈中), 定义一次
a = 10; // 初始化

上面也适用函数

左值(lvalue)-引用内存位置的表达式. 左值可以在=左边或右边 右值(rvalue)-存储在内存中某个地址的数值. 只能存在=右边

define

定义时没有值时, 代码中会默认0, 但只能在#ifndef 或者 #ifdef中使用; 如是是编译时 添加-DQQTEST时, 会赋值1.

Storage Classes

默认是所有文件可见

auto

默认的存储类型, auto只能用在函数中.

register

有可以的话把值保存到寄存器中, 值类型不能超过寄存器大小(一个字), 不能使用&取地址( 因为不在内存中, 没有地址).

static

静态内存是栈空间内存, 因为可以预计内存大小, 所以不用程序员分配. 静态内存在程序 运行期间都有效.

global static variable:

  1. 初始化为0
  2. 静态内在中分配
  3. 定义源文件中可见

static variable:

  1. 初始化为0
  2. 静态内在中分配
  3. 可见性还是在块内, 但是生命周期是全程序, 也就是变量值在函数调用间保持不变.

static function:

  1. 定义源文件中可见
  2. 函数内变量在该函数调用间保持不变

extern

extern 是external 简写, 声明一个外部全部 c/c++中允许多次声明, 但只能一定义一次, 如果定义多次会出现Multiply defined问题. 如果出现上述问题, 为了兼容旧项目可以添加-fcommon编译选项. 最好是修改代码, 来 符合规范.

  1. 公共头中声明全局变量

    // a.h extern int a;

  2. 公共实现中定义变量

    int a = 5;

  3. 其他文件中声明外部全局变量

    extern int a;

  4. 其他使用

    extern const int a; // 外部常量声明 static int a; // 内部全局变量声明 extern int a = 5; // 全局变量声明及定义

C - Operators

Operators Precedence in C

Category Operator Associativity  
Postfix () [] -> . ++ – Left to right  
Unary + - ! ~ ++ – (type)* & sizeof Right to left  
Multiplicative * / % Left to right  
Additive + - Left to right  
Shift « » Left to right  
Relational < <= > >= Left to right  
Equality == != Left to right  
Bitwise AND & Left to right  
Bitwise XOR ^ Left to right  
Bitwise OR | Left to right  
Logical AND && Left to right  
Logical OR || Left to right  
Conditional ?: Right to left  
Assignment = += -= *= /= %=»= «= &= ^= = Right to left
Comma , Left to right  

Function

// Declarations
return_type function_name( parameter list );
// Defining
return_type function_name( parameter list ) {
   body of the function
}

Array

type arrayName [ arraySize ];

Point

type *var-name;

Preprocessors

1	#define Substitutes a preprocessor macro.

2	#include Inserts a particular header from another file.

3	#undef Undefines a preprocessor macro.

4	#ifdef Returns true if this macro is defined.

5	#ifndef Returns true if this macro is not defined.

6	#if Tests if a compile time condition is true.

7	#else The alternative for #if.

8	#elif #else and #if in one statement.

9	#endif Ends preprocessor conditional.

10	#error Prints error message on stderr.

11	#pragma Issues special commands to the compiler, using a standardized method.

Type casting

(type_name) expression

error handling

errno, perror(). and strerror()

Memory Management

<stdlib.h>
void *calloc(int num, int size);
void free(void *address);
void *malloc(size_t size);
void *realloc(void *address, int newsize);

Reference

Cprogramming
c-code-style
The International Obfuscated C Code Contest
C Programming Language Tutorial
The Standard C
The GNU C Library (glibc)
lattera/glibc
C Coding Standard
Clang-Format Style Options