C的陷阱与缺陷小记



TIP1:

“=”表示的是赋值符号它是一个操作符而“==”是比较符号。

比较符号这样书写if(flag == x){}就不会导致“==”误写成“=”依然通过编译。


TIP2:

C语言中“&&”表示取并的逻辑运算,而“&”表示按位求与操作。

                               “||”表示取或的逻辑运算,而“|”表示按位求或操作。


TIP3:

C语言中编译器总是用贪心算法读入符号,即C语言总是不断的读入字符组成C语言的语法符号,直到它不能成为一个符号为止。

例如:b---a == (b--)- a;


TIP4:

C语言总是把以0开头的数字符作为8进制数。例如:123 == 0x85而        0123 == 0x53;    二者大小大相径庭。


TIP5:

单引号括起来的是一个代表字符的整数,双引号括起来的代表的是一个字符串首地址的指针,二者有着本质的区别。

int  X = 'C';正确

int X = "C";                    错误

char *px = "C";                 正确

char *px = ‘C’;               错误


TIP6:

在紧接着if、for等条件语句后要紧跟着语句时不能多一个分号。

例:

if(x > b);

x = b;这就是无论x是否大于b。x = b;都会被执行。

也不能在一些语句后遗漏一些分号

例:

if(x > b)

return

b--;

a--;这样返回的就是return b--;了。


TIP7:

如果定义了函数fun();调用时也要fun();即使其没有参数,如果fun;只是计算了它的函数地址。


TIP8:

C语言中else始终与同一括号的内最近的未匹配的if相结合。注意要保持缩进这才是良好的编程风格。

例:

TIP9:

关于数组的两点注意:

A:C语言中没有多维数组的概念。二维数组无非是一个以一维数组为元素的一维数组罢了。

数组的大小必需在编译期就被一个常数所确定。

        B:对于数组我们能确定的就是其大小以及该数组下标为0的元素的地址而数组名这个变量存储的就是这个地址。

也就是一个常指针。


TIP10:

定义数组a[10];只有在sizeof(a);时它代表的是整个数组。其他时候代表的都是数组下标为0的元素的首地址。


TIP11:

要始终记着:C语言中没有所谓的二维数组、三维数组,只有一维数组。

例:定义数组iAAnode[4][6];代表的是iAAnode[0]的地址。

也就是指向iAAnode[0]的指针同理它是一个(ing)[6]型指针,那么iAAnode[3]表示的是一个数组名。

于是我们有

int *p = iAAnode[3];

int *p = *iAAnode;

int (*p)[6] = iAAnode;

*(*(iAAnode + 3)+5) == *(iAAnode[3]+5) == iAAnode[3][5];表示的是最后一行最后一个int元素。


TIP12:

字符串代表的是内存中一块包含字符串本身及“\0”结束符的内存首地址。strlen返回的是字符串的字符个数不包括“\0”;


TIP13:

C标准允许取数组中实际不存在的“溢界”元素的地址用来赋值与比较。


TIP14:

C语言规定了四个运算符的求值顺序:

A:a||b       先对a求值,如果a为假则对b求值。如果a为真,则不再对b求值、

B:a&&b      先对a求值,如果a为假则对不对b求值。如果a为真,则再对b求值。

C:(a)? (b) : (c);

      先对a求值,如果a为真,再对b求值c不再求值。反之,再对c求值不再对b求值。

D:a , b;     先对a求值,丢弃a的值。再对b求值,将b的值作为整个表达式的值。

但是要特别注意的是函数中形参列表中的逗号并非逗号表达式。


TIP15:

C语言中的函数的返回值如果显示的声明则默认为int型。


TIP16:

每一个外部变量(全局变量)可以声明多次但只能定义一次。当用一个static修饰一个外部变量或函数时,则这个对象只在当前文件中可见,其他文件不可见。


TIP17:

一个未声明的标识符,后跟一个括号。则它视为一个返回为整型的函数。


TIP18:

sizeof()返回的是一个对象的内存占用的字节数。是一个无符号的数。


TIP19:

关于宏:

宏定义的符号是#define后第一次出现空格的之前的所有字符组成的字符串,但这只在宏定义时起作用。

例:

#define   f(x)                         (x++)    预编译器在编译时是用f(x)代替(x++)

#define   f   (x)                      (x++)    预编译器在编译时是用f代替    (x)(x++)

                                                但是如果程序执行时有(x++)      则用f     (x)  代替。

TIP20:

   宏与typedef的区别

          例:

#define         PType1                       char *

#define         char *                       PType2

定义两个变量:

PType1     pa1,            pb1;

PType2     pa2,             pb2;

pa1表示指向char型的指针。

pb1表示char型变量。

pa2与pb2均表示一个指向char型的指针。PType2 是一个与char *有相同功效的数据类型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值