标准: ISO/IEC 9899:年份(89, 90, 95, 99, 11, 18)
C是一门流行的语言, 融合了计算机科学理论和实践的控制特性. C语言的设计理念让用户 能轻松地完成自顶向下的规划, 结构化编程和模块化设计. 因此, 用C语言编写的程序更易 懂, 更可靠.
1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。
extern int a ; // 声明变量, 可以声明多次
int a ; // 定义变量(会分配内存在栈中), 定义一次
a = 10; // 初始化
上面也适用函数
左值(lvalue)-引用内存位置的表达式. 左值可以在=
左边或右边
右值(rvalue)-存储在内存中某个地址的数值. 只能存在=
右边
定义时没有值时, 代码中会默认0, 但只能在#ifndef 或者 #ifdef中使用; 如是是编译时 添加
-DQQTEST
时, 会赋值1.
默认是所有文件可见
默认的存储类型, auto只能用在函数中.
有可以的话把值保存到寄存器中, 值类型不能超过寄存器大小(一个字), 不能使用
&
取地址( 因为不在内存中, 没有地址).
静态内存是栈空间内存, 因为可以预计内存大小, 所以不用程序员分配. 静态内存在程序 运行期间都有效.
global static variable:
static variable:
static function:
extern 是external 简写, 声明一个外部全部 c/c++中允许多次声明, 但只能一定义一次, 如果定义多次会出现Multiply defined问题. 如果出现上述问题, 为了兼容旧项目可以添加
-fcommon
编译选项. 最好是修改代码, 来 符合规范.
公共头中声明全局变量
// a.h extern int a;
公共实现中定义变量
int a = 5;
其他文件中声明外部全局变量
extern int a;
其他使用
extern const int a; // 外部常量声明 static int a; // 内部全局变量声明 extern int a = 5; // 全局变量声明及定义
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 |
// Declarations
return_type function_name( parameter list );
// Defining
return_type function_name( parameter list ) {
body of the function
}
Call by reference
void (signal(int sig, void (func)(int)))(int);
typedef void (*SigCatcher)(int); SigCatcher signal(int sig, SigCatcher func);
type arrayName [ arraySize ];
type *var-name;
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_name) expression
errno, perror(). and strerror()
<stdlib.h>
void *calloc(int num, int size);
void free(void *address);
void *malloc(size_t size);
void *realloc(void *address, int newsize);
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