一直在经历这段代码:
#include<cstdio>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {1,2,3,4,5,6,7};
int main()
{
signed int d;
printf("Total Elements in the array are => %d\n",TOTAL_ELEMENTS);
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
现在显然它没有进入 for 循环。 什么原因?
最佳答案
原因是在 C++ 中你得到了隐式提升。尽管d
当您将它与 (TOTAL_ELEMENTS-2)
进行比较时,它被声明为已签名(由于 sizeof
而未签名),d
被提升为无符号。 C++ 有非常具体的规则,基本上声明 d 的无符号值将是一致的无符号值 mod numeric_limits<unsigned>::max()
.在这种情况下,结果是最大可能的无符号数,它明显大于比较另一侧的数组大小。
请注意,某些编译器(如 g++(带 -Wall))可以被告知对此类比较发出警告,因此您可以确保代码在编译时看起来正确。
关于c++ - 为什么输出不是预期的那样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356925/