《C与陷阱》 笔记

1、词法分析中的贪心法:

规则:每个符号包含尽可能多的字符 。即:读入符号的下一个字符,若2个字符组成的字符串依然是一个符号的组成部分,继续读入下一个字符,直到不能组成一个符号为止。

如:

a---b   <——>   a-- - b   与a- --b区别

y = x/*p 此时p被注释          应为  y =  x / *p (/ * 间有空格)  或y= x/(*p)

a -= 1  


2、字符与字符串


int main()
{
char *p = '
a';
printf("%c",*p);
}


int main()
{
printf('\n');
}
                               


int main()
{
char p = 'abcd';
printf("%c",p);
} //输出字符d    (总是输出最后一个字符)

以上2条语句都能通过编译,但不能执行

//p指向内存地址为a的ascii码的空间

用单引号括起来的字符代表整数,用双引号括起来的字符串代表指针



3、 (*(void(*)())0)()

float  (*h)()  //h指向一个 返回值为浮点类型的函数的指针

(float (*)()) //表示一个 “返回值为浮点类型的函数的指针”的类型转换符

将常数0转化为 指向void类型的函数的指针: ( void (*)())0

( void (*)())0  代替函数指针h      ---------(*(void(*)()0))()

信号处理函数: void(*signal(int, void(*)(int)))(int)  //返回一个指向void类型的函数的指针

typedeef  void    (*HANDLER)(int)

(*HANDLER)(int)signal(int, HANDLER)



4、运算符优先级

1、数组下标[]、-> 等 (非真正意义上的运算符)  结合性:从左到右    

如:a.b.c = (a.b).c

2.单目运算付:! &(取址)  *  ++  --  sizeof 结合性:从右到左     类型转化(type) 也是单目运算符

*p++   : 先自增p,再*

3、双目运算符

优先级: 算术运算符>移位运算符>关系运算符》逻辑运算符》赋值运算符》条件运算符(即三目运算符)

4、逗号运算符优先级最低 (常用于宏定义)

whie(c = getc(stdin) != EOF)

putc(c, stdout)       //赋值运算符优先级在二目运算符中最低,实际上C存储的是getc函数的返回值与EOF比较的结果, 一串二进制1

whie((c = getc(stdin)) != EOF)

putc(c, stdout) //应用括号括起来

5、函数调用

f();  //是一个函数调用

f;  //什么也不做, (计算函数f的地址,却不调用函数)


6、函数返回值

若一个返回值为整型的函数 无return 语句, 则该函数会随机返回一个垃圾整数(任意)

对于main函数,若有些管理软件系统关心main函数的返回状态, 则main函数必须要有返回值

一般return 0  或者exit(0)   非0表示返回错误状态信息


你可能感兴趣的:(《C与陷阱》 笔记)