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操作。