《C专家编程》笔记一:第二章 这不是Bug,而是语言特性

时间:2020-12-23 23:55:48

1.witch 块左花括号后面紧跟着的变量加上初始化值是没有什么用的,因为它不会执行-语句从匹配表达式的case开始执行

2.case 只能是常量或者常量表达式,不能跟const常量(const常量并不是真正的常量)

如 const int a=5;

……

case a:…… 这是非法的。

3.ANSI C引入了相邻字符串常量将自动合并成一个字符串的约定。(以前是 用“\” 来表示是同一行不分开)

char *available_resources[] = {

"color monitor",

"big disk"    // 这里不小心丢了个逗号,则 big disk 与 cray合成一个字符串“ big diskCray” ,这个数组就只有两个元素

"Cray", // 这个多余的逗号没有用,有木有都无所谓

}

4.extern 用于函数定义,表示全局可见(不用的函数默认也是全局可见)

               用于变量,表示它在其他地方已经定义

5.static 修饰函数,表示该函数只有本文可见 (与 默认或者extern修饰的函数相对)

              用于变量,表示变量的值一直保持

6.sizeof不是函数,是一个运算符,sizeof的操作数如果是类型名那就要加括号,如果是变量那可以不用括号

 p=N * sizeof * q;

r=malloc(p);

*q是操作数 第一个*是乘法,第二个*是指针

7,优先级

      [ ] 高于 *  :int  *ap[ ] 实际表示结果为int *(p[ ]),ap是一个元素为int指针的数组,不是 int (*ap)[ ] --ap一个指向int数组的指针

      函数()高于* ,int *fp()实际结果为int *(fp()),fp是一个返回int *的函数,不是一个返回int的函数指针--int (*fp)( )

       赋值符(包括复合赋值符)都具有右结合性,从右到左执行,但是 也有左结合性操作符(如 位操作符“&”、“|”)

       函数调用中,各个参数的计算顺序不确定

      大部分表达式中各个操作数 计算的顺序是不确定的,它的目的是为了让编译器设计者选择最合适的方法来产生最快的代码。

8.const变量编译器一般都会通过符合替换,把每处用到const变量的地方替换成实际值-不是从内存地址取值,所以通过指针地址改变const在内存中的值,但是程序代码中对const变量引用的地方还是原来的数值,因为他没有从内存取值

9.尽量不要使用unsigned,因为与其他类型遇到unsigned都会提升为相应的unsigned的类型