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表示返回错误状态信息