在以下代码中,
#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吗?
发布于 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是假的。
发布于 2016-10-30 12:24:39
除法sizeof(array)/sizeof(array[0])导致一个无符号int,所以当比较索引= -1或从它减去时,将隐式转换为无符号int,即0 0xffffffff,因此条件失败。
相反,只需在宏中执行显式强制转换即可。
#define TOTAL_ELEMENTS (int)(sizeof(array) / sizeof(array[0]))就我个人而言,我会用一个参数来证明你的TOTAL_ELEMENTS
#define TOTAL_ELEMENTS(ar) (int)(sizeof(ar))/sizeof(ar[0]))才能让代码更易读。
https://stackoverflow.com/questions/40328986
复制相似问题