首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用比较运算符的隐式转换

使用比较运算符的隐式转换
EN

Stack Overflow用户
提问于 2016-10-30 12:20:40
回答 2查看 265关注 0票数 1

在以下代码中,

代码语言:javascript
复制
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))

int main(void){
  int array[] = {7,5,4,3,2};
  int index = -1;
  for(;index <= TOTAL_ELEMENTS-2;index++)
    printf("%d\n", array[index+1]);
  return 0;
}

index <= TOTAL_ELEMENTS-2在打印单个元素之前失败。

-1 <= (5-2)中计算的不是条件for-loop吗?

EN

回答 2

Stack Overflow用户

发布于 2016-10-30 12:30:23

sizeof(array) / sizeof(array[0])生成size_t类型的5。因此,表达式sizeof(array) / sizeof(array[0])-2的类型也是size_t,它是一个无符号整数类型。比较的LHS也被提升为size_t类型(参见通常算术变换),而-1在转换后等于SIZE_MAX ( size_t可以持有的最大值)。

因此,与SIZE_MAX <= 3等价的比较SIZE_MAX <= 3是假的。

票数 2
EN

Stack Overflow用户

发布于 2016-10-30 12:24:39

除法sizeof(array)/sizeof(array[0])导致一个无符号int,所以当比较索引= -1或从它减去时,将隐式转换为无符号int,即0 0xffffffff,因此条件失败。

相反,只需在宏中执行显式强制转换即可。

代码语言:javascript
复制
#define TOTAL_ELEMENTS (int)(sizeof(array) / sizeof(array[0]))

就我个人而言,我会用一个参数来证明你的TOTAL_ELEMENTS

代码语言:javascript
复制
#define TOTAL_ELEMENTS(ar) (int)(sizeof(ar))/sizeof(ar[0]))

才能让代码更易读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40328986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档