《C专家编程》第三章读书笔记

1、
    NUL     用于结束一个ACSII字符串
    NULL    表示指针什么也不指向
2、
    malloc(strlen(str))
    malloc(strlen(str)+1)
3、switch "fall through"设计缺陷
4、ANSI C引入的新特性之一:相邻的字符串常量被自动合并成一个字符串的约定。这就省掉了过去在书写多行信息时必须在行末添加"\"的做法,后续的字符串可以出现于每行的开头。
    旧风格:
    printf("A favorite children's book \
    is muffy Get IT : the hilarious tale of a cat,\
    a boy,and his machine gun");
    现在可以用一连串相邻的字符串常量来代替他,它们在编译的时候自动合并。除了最后一个字符串外
,其余每个字符串末尾的'\0'都会被自动删除。  
  printf("A favorite children's book"
    "is muffy Get IT : the hilarious tale of a cat,"
    "a boy,and his machine gun");
    然而,这种自动合并意味着字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器将不会发出错误消息,而是悄无声息的把两个字符串合并在一起。如下面的例子所示:
#include <stdio.h>
char *available_resource[] = {
    "clolor monitor",
    "big disk",
    "Cray"
    "Online drawing routines",
    "mouse",
    "key board",
};

int main()
{
    char *s;
    s = available_resource[2];
    printf("te"
           "st \%s",s);
    return 0;
}
    这样,available_resource[2] 就成了“ Crayon-line drawing routines”。这跟原先的意思大相庭径,粉笔(crayon) 竟也成了硬件资源!字符串的数目比预期约少了一个。这样,如果在程序中修改了available_resouce[6]
,就等于修改了其他的变量。
5、计算的次序
    在表达式中如果有布尔操作、算术运算、位操作等混合运算,应该在适当的地方加上括号,使之清楚明了。
    在优先级和结合性规则告诉你哪些符号组成一个意群的同时,这些意群内部如何进行计算的次序始终是未定义的。在下面的表达式里:  x=f() +g() *h();
      g()和h()的返回值先组成一个意群,执行乘法运算,但g()和h()的调用可能以任何顺序出现(g()的调用不一定早于h())。类似,f()可能在乘法之前也可能在乘法之后调用,也可能在g()和h()之间调用。惟一可以确定的就是乘法会在加法之前执行(因为乘法的结果是加法运算的操作数之一).如果编写程序时要依赖这些意群计算的先后次序,那就是不好的编程风格。大部分编程语言并未明确规定操作数计算的顺序。之所以未作定义,是想让编译器充分利用自身架构的特点,或者充分利用存储于寄存器中的值。

6、gets()函数不安全

7、函数返回值不能为栈内存中的地址。

8、  理解C 语言声明的优先级规则
  A  声明从它的名字开始读取,然后按照优先级顺序依次读取。
  B  优先级从高到低依次是:
        B.1  声明中波括号括起来的那部分
        B.2  后缀操作符:
            括号() 表示这是一个函数,  而方括号[]表示这是一个数组。
        B.3  前缀操作符:  星号*表示  “指向...的 指针”
  C  如果const 和volatile 关键字的后面紧跟类型说明符(如int,long 等),那么它作用于类型说明符。 在其他情况下,const 和volatile 关键字作用于它左边紧邻的指针星号。 自己理解:const 和volatile修饰右边整体部分
9、使用typedef 的提示
  不要为了方便起见对结构体使用typedef。  这样做惟一的好处是能使你不必书写“struct”关键字,但这个关键字可以向你提示一些信息,而不应该把它省掉。
   typedef应该用在:
    a.数组、结构、指针以及函数的组合类型。
    b.可移植类型。比如当你需要一种至少20 比特的类型时,可以对它进行typedef 操作typedef 的提示声明。这样,当把代码移植到不同的平台时,要选择正确的类型如short.int,long时,只要在typedef 中进行修改就可以了,无需对每个声明都加以修改。
    c.typedef也可以为后面的强制类型转换提供一个简单的名字,

猜你喜欢

转载自blog.csdn.net/u013178472/article/details/80177900