为了账号安全,请及时绑定邮箱和手机立即绑定

一个谜语(在C中)

一个谜语(在C中)

C
慕虎7371278 2019-07-31 10:38:58
一个谜语(在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签名所以没有问题。


查看完整回答
反对 回复 2019-07-31
?
白板的微信

TA贡献1883条经验 获得超3个赞

sizeof操作者产生类型的结果size_t。在第一个版本中,您将int(签名)与size_t(未签名)进行比较。

在第二个版本中,通过赋值将size_t表达式转换为a int,因此比较的两个操作数具有相同的类型。


查看完整回答
反对 回复 2019-07-31
?
慕容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返回无符号数据类型,但它与签名数据类型进行比较( - 是一个错误)


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 428 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信