一个谜语(C)

一位朋友给了我一个谜语:

#include<stdio.h> #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]); getchar(); return 0; } 

上面的代码应该是打印所有的数组元素,代码中的问题是什么(输出是什么)? 我认为循环不会迭代一次?

我发现下面的代码可以工作:

 #include<stdio.h> #define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0]))) int array[] = {23,34,12,17,204,99,16}; int main() { int d; int x = (TOTAL_ELEMENTS-2); for(d=-1;d <= x;d++) printf("%d\n",array[d+1]); getchar(); return 0; } 

我有一个理论,这是macros观的事情,但我不能把我的手指在这个问题上。

问题是(TOTAL_ELEMENTS-2)是一个无符号值。 当进行比较d <= (TOTAL_ELEMENTS-2) ,两个值都转换为无符号值,结果为false。

在你的第二个例子中, x被签名,所以没有问题。

sizeof运算符产生size_ttypes的结果。 在第一个版本中,你正在比较int (signed)和size_t (unsigned)。

在第二个版本中,通过赋值将size_texpression式转换为int ,因此两个操作数的types都是相同的。

看到这个问题的另一种方式如下

 #include<stdio.h> int main() { int i = -5; unsigned int j = 6; if(i < j) printf("-5 is less than 6"); else printf("-5 is greater than 6"); return 0; } 

输出是:

 -5 is greater than 6 

原因:比较无符号整数与有符号整数将始终返回false。

在提问者情况下, sizeof返回无符号数据types,但它与签名数据types进行比较( – 是一个错误)

我运行下面的程序,而不使用任何macros,输出什么也没有

 #include<stdio.h> int main() { int d; for(d=-1;d<=sizeof(int);d++) { printf("sizeof operator\n"); } return 0; } 

所以这意味着问题不在MACRO中,而是价值规模的回报types。 sizeof返回的数据types的大小为size_t这是无符号的,-1隐式转换为无符号的,这是0xffffffff ,明显大于sizeof(int)。 另请参阅不兼容代码示例(比较)