C专家编程(1)

这一系列主要记录阅读《C专家编程》中,需要注意的一些内容。

寻常算术转换(P22-24)

P23:当执行算数运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高、长度更长的方向转换,整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int d=-1;
if (d <  TOTAL_ELEMENTS -2)
    xxx;  // 实际执行不到 

sizeof()返回类型为无符号数,比较时d被升级为unsigned int类型。

解决方法是对TOTAL_ELEMENTS强制类型转换为int,即

if (d <  (int)TOTAL_ELEMENTS -2)

符号“重载”(P37-38)

许多操作符在不同的场景下会有不同的意义,如staticvoid*等。

另外,还有一些符号具有多个容易混淆的意思。

p = N * sizeof * q;  // (1)
apple = sizeof(int) * p;  // (2)

(1)中,第一个*表示乘法,而第二个*表示指针,sizeof操作符把q指向的内容作为操作数,返回该对象的类型的字节数(sizeof的操作数是变量时可以不加括号)。

(2)中,表示把int的长度乘以p,而不是把未知类型的指针p强制转换成int,然后进行sizeof操作。

posted @ 2021-01-07 17:11  maxiaowei0216  阅读(75)  评论(0编辑  收藏  举报