一个谜语(在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;
}我有一个理论认为它与宏有关,但我不能指责问题。
3 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
问题是这(TOTAL_ELEMENTS-2)
是一个无符号值。进行比较时d <= (TOTAL_ELEMENTS-2)
,两个值都将转换为无符号值,结果为false。
在你的第二个例子中,x
签名所以没有问题。
白板的微信
TA贡献1883条经验 获得超3个赞
的sizeof
操作者产生类型的结果size_t
。在第一个版本中,您将int
(签名)与size_t
(未签名)进行比较。
在第二个版本中,通过赋值将size_t
表达式转换为a int
,因此比较的两个操作数具有相同的类型。
慕容3067478
TA贡献1773条经验 获得超3个赞
另一种看待这个问题的方法如下
#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返回无符号数据类型,但它与签名数据类型进行比较( - 是一个错误)
- 3 回答
- 0 关注
- 428 浏览
添加回答
举报
0/150
提交
取消