C的一些细节,语法:
()&&()先计算前面若为0,后面不执行
a--先用后减 --a先减再用
数组初始化,所附数值个数小于数组长度时自动补0
函数参数为数组时 形参可以是数组或指针
static int fun ()静态(内部)函数,只供本文件其他函数调用 修饰变量则只能被本文件引用
extern int fun()声明函数 可引用其他文件函数,无需include
extern 声明变量 可调用其他文件的变量 ,无需include
运算符从左至右 如a>b>n 若a=3,b=2,c=1 则前式等于0
枚举类型
enum
weekday{sun,mon,tue,wed,thu,fri,sat};
enum
weekday a,b,c;
//或者为:
enum
weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;
//或者为:
enum
{sun,mon,tue,wed,thu,fri,sat}a,b,c;
|
1
2
3
|
struct
tag {
member-list
} variable-list ;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int
a;
char
b;
double
c;
} s1;
//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct
SIMPLE{
int
a;
char
b;
double
c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct
SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef
struct
{
int
a;
char
b;
double
c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
|
1
2
3
4
5
6
7
8
9
10
|
//此结构体的声明包含了其他的结构体
struct
COMPLEX{
char
string[100];
struct
SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct
NODE{
char
string[100];
struct
NODE *next_node;
};
|
1
2
3
4
5
6
7
8
9
10
11
|
struct
B;
//对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct
A{
struct
B *partner;
//other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct
B{
struct
A *partner;
//other members;};
|
带参宏定义的一般形式为: #define 宏名(形参表) 字符串,字符串可以写有关形参的操作
例如#define MAX(a,b)((a>b)?(a):(b))
typedef:
如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;
如果放在某个函数内,定义域就是从定义开始直到该函数结尾;
#define:
不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
预处理器发现 #include 指令后,就会寻找指令后面<>中的文件名,并把这个文件的内容
包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include 指令, 就像你把
被包含文件中的全部内容键入到源文件中的这个位置一样。故头文件里的define会作用到main里
另外,比如sys.h前面都会写
#ifndef __SYS_H
#define __SYS_H
#define....
#endif
这就是为了防止多次包含同一个文件重复定义的问题
关于typedef struct A{int a ......}B,C; 这里等同于typedef struct A{int a ......}B,和typedef struct A{int a ......}C
所以下面的代码:
typedef struct Node{ int data; struct LNode *next; }LNode,*LinkList;
LinkList是一个类型,为结构体指针类型