在下面所示的代码中,没有打印任何内容,这意味着for
循环失败。可能是什么原因?
我想知道因为当我打印时TOTAL_ELEMENTS
单独地,它给出5
,所以自然这一定是5-2=3 => -1<=3
,所以它应该打印一些东西。
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = { 23, 34, 12, 17, 204, 99, 16 };
int main()
{
int d;
for (d = -1; d <= (TOTAL_ELEMENTS - 2); d++) {
printf("%d\n", array[d + 1]);
}
return 0;
}
有人可以解释一下这段代码吗?
这是“通常算术转换”的结果。
来自第 6.3.1.8 节C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf:
如果两个操作数具有相同的类型,则无需进一步转换
需要。
否则,如果两个操作数都具有有符号整数类型或都具有
无符号整数类型,类型较小的操作数
整数转换rank 转换为操作数的类型
具有更高的等级。
否则,如果具有无符号整数类型的操作数有
等级大于或等于其他类型的等级
操作数,则有符号整数类型的操作数为
转换为无符号整数操作数类型
类型。
否则,如果操作数的类型为有符号整数类型可以
用无符号表示操作数类型的所有值
整数类型,则无符号整数类型的操作数为
转换为有符号整数类型的操作数类型。
否则,两个操作数都转换为无符号
整数类型对应有符号操作数的类型
整数类型。
The sizeof
运算符返回一个size_t
,这是一个无符号值。所以(sizeof(array) / sizeof(array[0])) - 2
也未签名。
由于您正在比较有符号值和无符号值,因此有符号值将转换为无符号值。将 -1 转换为无符号会产生最大的无符号值,这会导致比较结果为 false。
如果您将右手边投射到int
,它将按预期工作。
for(d=-1;d <= (int)(TOTAL_ELEMENTS-2);d++)
Output:
23
34
12
17
204
99
16
或者,您可以通过标准化数组索引方式来避免该问题:
for (d = 0; d < TOTAL_ELEMENTS; d++) {
printf("%d\n", array[d]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)