C语法细节

关于c语言类型转换

 

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;
 结构体定义

 

结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。[1]  
1
2
3
  struct  tag {
  member-list
  } variable-list ; 
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:[1]  
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;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。[1]  
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的 指针,而通常这种 指针的应用是为了实现一些更高级的数据结构如链表和树等。[1]  
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]  
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是一个类型,为结构体指针类型

转载于:https://www.cnblogs.com/otaganyuki/p/9742877.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值