第一章 词法“陷阱”
1.1 =不同于==
1,=是赋值运算符;==是比较运算符,用来判断两个变量是否相等,相等返回true,不等返回false,常用于wile循环的控制和if判断语句。
2,C语言种的一个空格,' ',不等于零,它是有ASCII码值的,值为32。
扩展:谈到==让我想到一个题,是JAVA语言种的,“==与equals的区别”
这里给大家讲解一下,在JAVA里面内存分为栈内存和堆内存,比如我们定义两个变量:
int a = 2;
int b = 2;
那么这两个变量在内存中是下图这样的:
OK,那么也就是a和b这两个变量存在栈内存,相当于C语言里面的指针,所以a和b在内存里面存储的不是2,而是两块内存的地址,那个地址所在的内存里面放的是2!
那么equals比较的是两个变量所指地址的内存里面的值是否相等,所以上图a.equals(b)返回的就是true。
而a==b则返回的是false!!!这是因为==比较的是a和b指向的地址是否相同,如下图a==b才返回的是true:
1.2 &和|不同于&&和||
&和|是位运算符,其中&是按位与,|是按位或
&&和||是逻辑运算符,运算后的结果一般为true或false,或者说1或0
1.3 词法分析中的“贪心法”
1,在判断一个字符或者连续几个字符是否独立存在,还是说为某些多字符符号种的一部分,C语言采用了贪心法。即从左到右读入字符,如果读入的字符能与前面的字符组合成一个新的字符组合,则按新的字符组合来处理,一直到下一个字符不能与前面的字符组合成新的字符为止,那么当前这个新的字符只能自己单独存在,或者看后面的字符能不能与它再组合新的字符。
2,注意除了字符串和字符常量,符号中间不能有空格,制表符,换行符。
1.4 整型常量
注意整数前面不能随意加0,一个十进制数可能会被编译器当作8进制数处理
1.5字符与字符串
单引号引起的是字符,是可以被转化为ASCII码的,当作一个数值
双引号引起的是一个字符串
第二章 语法陷阱
2.1 理解函数声明
C语言中可以声明变量也可以做函数声明和指针类型的声明,如:
float f,g;声明变量;
float ff();声明表达式,即表达式ff()的返回结果是浮点型;
float *pf; 声明指针,即pf指向一个浮点数;
进一步组合float (*h)(); 表示h是一个指向返回值为浮点数的函数的指针,所以(*h)()就是调用函数的方式,而我们现在经常写的h(),这种调用方法的形式实际上是一种简写!
如果想把float (*h)()变成一种类型,需要在两边加上括号,即(float (*h)()),叫做指向返回值为浮点数的函数的指针的类型转换符!
2.2 运算符的优先级
C语言的运算符优先级跟JAVA语言的运算符基本一致!
需要注意的有两点:第一,逻辑运算符都都低于关系运算符;第二,位移运算符都低于算术运算符,但都高于关系运算符!
2.3 注意作为语句结束标志的分号
2.4 switch语句
这里需要注意一点:switch支持的参数类型,在C/C++里面是char ,int short long , 当然还有unsigned char , unsigned int。 而char[] ,string 则不可,会编译不通过。但是JAVA7以前跟C语言都是这个规则,JAVA7以后可以支持String类型。
2.5 函数调用
C语言要求函数调用时可以不带参数,即参数列表可以为空,但是括号不能省略,虽然括号内部可以为空!
2.6 “悬挂”else引发的问题
这部分组要注意else与if的配对!
第三章 语义陷阱
3.1 指针与数组