先让我们看如下一个例子:
#include <stdio.h>
#define DELTA sizeof(int)
using namespace std;
int main() {
int i;
for (i = 40; i - DELTA >= 0; i -= DELTA) {
printf("%d ", i);
}
return 0;
}
上面程序的结果是什么呢?答案是程序陷入死循环,不停地输出数值。
不难发现,从输出结果中我们可以推断出“i - DELTA >= 0;”这个语句并没有起到应有的作用。这是为什么呢?
首先sizeof()的返回值为size_t,当size_t和int类型进行运算的时候,int类型会隐式转换成size_t,而size_t类型是无符号数,所以会永远大于等于0,因此循环的条件永远满足,会一直持续下去。
让我们来看另外一个例子理解:
#include<iostream>
#include<typeinfo>
#include<stdio.h>
using namespace std;
int main() {
int a = -9;
size_t b = 2;
if (a < b) {
printf("a < b\n");
}
else {
printf("a > b\n");
}
cout << typeid(b).name() << endl;
return 0;
}
该程序的输出结果如下:
如上文所讲,a与b进行比较时,a先隐式转换成size_t类型,此时a已经是一个很大的正数了,所以自然大于2。在我的VS2017中,size_t的类型为unsigned int。此时满足隐式类型转换的规则,:
若两种类型的字节数不同,转换成字节数高的类型
若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
常见操作数类型的隐式转换等级如下图所示,默认从等级高向等级低的转换: