这一系列主要记录阅读《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)
许多操作符在不同的场景下会有不同的意义,如static
、void
、*
等。
另外,还有一些符号具有多个容易混淆的意思。
p = N * sizeof * q; // (1)
apple = sizeof(int) * p; // (2)
(1)中,第一个*
表示乘法,而第二个*
表示指针,sizeof
操作符把q
指向的内容作为操作数,返回该对象的类型的字节数(sizeof
的操作数是变量时可以不加括号)。
(2)中,表示把int
的长度乘以p
,而不是把未知类型的指针p
强制转换成int
,然后进行sizeof
操作。