一个谜语(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_t
types的结果。 在第一个版本中,你正在比较int
(signed)和size_t
(unsigned)。
在第二个版本中,通过赋值将size_t
expression式转换为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)。 另请参阅不兼容代码示例(比较)