C语言深度解剖小结

来源:互联网 发布:淘宝上的e卡怎么来的 编辑:程序博客网 时间:2024/06/05 06:07

1.关键字

ANSI C标准C语言共有32个关键字,这些关键字如下:
auto break case char const continue
default do double else enum extern
float for goto if int long
register return short signed sizeof static
struct switch typedef union unsigned void
volatile while
1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字:
inline_restrict _Bool _Complex _Imaginary
2011年12月8日,ISO发布C语言的新标准C11,该标准新增了1个C语言关键字:
Generic
----------------------------------->
static 修改变量 ,函数,主要两个主面产生作用:作用域和生命周期;
sizeof后可以不加括号(sizeof是关键字不是函数),例如sizeof x;
参数指明为void,表示该函数不接受任何参数,例如void fun(void)不是void fun();
const定义的只读变量在内存只有一份拷贝,例如const int x=5; int m=x;// m没有内存分配
指针+1的操作,1的单位取决于当前指针的单位,例如int a[5]={1,2,3,4,5};     (int*)(a+1), (int*)(&a+1)与(int*)((int)a+1)中1的含义不一致;
sizeof(enum)是4,enum枚举变量中的值是枚举常量,相当于整型;

2.符号

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

 

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

 

/=

除后赋值

变量/=表达式

 

*=

乘后赋值

变量*=表达式

 

%=

取模后赋值

变量%=表达式

 

+=

加后赋值

变量+=表达式

 

-=

减后赋值

变量-=表达式

 

<<=

左移后赋值

变量<<=表达式

 

>>=

右移后赋值

变量>>=表达式

 

&=

按位与后赋值

变量&=表达式

 

^=

按位异或后赋值

变量^=表达式

 

|=

按位或后赋值

变量|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

说明:

同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符


----------------------------------->

3.预处理


----------------------------------->

注释先于预处理指令处理,所以不能用宏开始或结束一段注释
可以这样定义#define EMPTY
将宏所定义的多条表达式放在大括号中。
示例:下面的语句只有宏的第一条表达式被执行。为了说明问题,for 语句的书写稍不符规范
#define INTI_RECT_VALUE( a, b )\
a = 0;\
b = 0;
for (index = 0; index < RECT_TOTAL_NUM; index  )
INTI_RECT_VALUE( rect.a, rect.b );
正确的用法应为:
#define INTI_RECT_VALUE( a, b )\
{\
a = 0;\
b = 0;\
}
for (index = 0; index < RECT_TOTAL_NUM; index  )
{
INTI_RECT_VALUE( rect[index].a, rect[index].b );
}
预处理指令中所有宏标识答在使用前都应先定义,除了#ifdef  #ifndef  defined(),例如#if X<0//如果X未定义,预处理器可能不给提示,直接定义并置零
#pragma pack(n)对齐方式,3点注意事项:
1。每个成员分别按自己的方式对齐,并能最小化长度。
2。复杂类型(如结构,类)的默认对齐方式是他最长的成员的对齐方式,这样成员是复杂类型时,可以最小化长度
3。对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理处理数组时可以保证每一项都边界对齐
"#"的使用:把语言符号转化为字符串
#define SQR(x) printf("The "#x"  is %d\n",((x)*(x)));
SQR(8);
output:
The 8 is 64
"##"的使用:把两个语言符号组合成单个语言符号
#define XNAME(n) x##n
XNAME(8)
output:
x8
注意:"#"和"##"在单一宏定义中只使用其中一个,且只一次,尽量不要使用这两个运算符

4.指针和数组


----------------------------------->

int a[5];//创建5个int的数组
sizeof(a[5]);// 值为4,正确,因为sizeof作为关键字,求值是在编译的过程中,根据数组类型来进行计算;
a与&a的值相同,但意义不一样,a与a[0]意义一致,表示首元素地址,&a表示整个数组的地址;
int a[3][2]={(0,1),(2,3),(4,5)};与int a[3][2]={{0,1},{2,3},{4,5}};的区分;
函数指针,函数指针数组,函数指针数组指针的区分;

5.内存管理


----------------------------------->

可执行程序包括BSS(Block Started by Symbol)段、数据段代码段(也称文本段),

然后还有堆heap,栈stack;

BSS存放的是未初始化的全局变量静态变量,数据段存放的是初始化后的全局变量和静态变量,二者合并可以理解为全局区;

局部变量存放在栈区,动态变量存放在堆区;

6.函数


----------------------------------->

函数名与返回值类型在语义上应不可冲突,典型反例是getchar,其返回值是int,所以char c;if(EOF==(c=getchar())),这里如果EOF值定义在char类型的int范围以外,就会发生截断;


7.文件

----------------------------------->

8.C语言基础测试题






原创粉丝点击