C For循环条件 #包括 #定义所有_mem(sizeof(x)/sizeof(x[0])) int x[]={1,2,3,4,5,6,7,8,9,10}; 内部主(空){ //printf(“条件为%d”,(全部为mem-2)); int i; 对于(i=-1;i

C For循环条件 #包括 #定义所有_mem(sizeof(x)/sizeof(x[0])) int x[]={1,2,3,4,5,6,7,8,9,10}; 内部主(空){ //printf(“条件为%d”,(全部为mem-2)); int i; 对于(i=-1;i,c,for-loop,C,For Loop,而言,all\u mem宏返回一个size\u t值;整数提升规则意味着对代码进行一些更正后对i进行比较,例如,sizeof()返回一个size\u t,而不是int代码工作正常 以下是修改后的代码: for(i = -1; i <=(ssize_t)(all_mem- 2); ++i) 编译时,始终启用所有警告,然后修复这些警告 如果遵循上述声明,那么如果没有我们的帮助,您就会看到问题 (对于gcc,至少使用:-Wall-Wextra-pedantic,我还添加了:-Wconversi

而言,
all\u mem
宏返回一个
size\u t
值;整数提升规则意味着对代码进行一些更正后对
i进行比较,例如,sizeof()返回一个
size\u t
,而不是
int
代码工作正常

以下是修改后的代码:

for(i = -1; i <=(ssize_t)(all_mem- 2); ++i)
编译时,始终启用所有警告,然后修复这些警告

如果遵循上述声明,那么如果没有我们的帮助,您就会看到问题


(对于gcc,至少使用:
-Wall-Wextra-pedantic
,我还添加了:
-Wconversion-std=c99

在有符号/无符号比较中,
i
被转换成
0xffffff
,这比
所有的mem-2
都要大。至少我认为是这样。你为什么要在-1开始
i
呢?我想我从来没有见过这样的代码。屏幕上没有看到任何东西吗?@Shahshaikh:自从op条件立即失败,您不会期望任何结果。程序可以简化为
int main(void){return 0;}
,这将产生任何输出。这不应该是
(int)吗
cast?@TomKarzes:Point.在实践中,我通常使用
size\u t
ssize\u t
类型作为索引变量来避免问题,因此
for
循环将保留为我的答案指定的循环,
I
的声明将更改为
ssize\u t;
。当然,
ssize\u t
可能会有问题,但实际上,用户虚拟内存通常限制在总内存空间的一半,因此可以假设数组长度适合有符号的
size\u t
。当然,我们知道数组很小,所以
int
溢出不会发生(非常确定没有一个版本的C
int
小于5位:-)。但这并不能解决问题。由于
i
-1
开始,循环将立即退出,正如OP报告的那样。它不起作用。事实上,强制转换没有任何效果,因为它已经是
size\u t
@TomKarzes:你误读了。我建议对
ssize\t
进行强制转换(注意额外的前导
s
,意思是有符号的
size\u t
),而不是
size\u t
(已经有了)。哦,是的,你完全正确,我误读了。我的错!
for(i = -1; i <=(ssize_t)(all_mem- 2); ++i)
#include <stdio.h>

#define all_mem (sizeof(x) /sizeof(x[0]))

int x[] ={1,2,3,4,5,6,7,8,9,10};

int main(void)
{
    printf( "all_mem = %ld\n", all_mem ); // << added for debugging

    //  printf("The condition is %d",(all_mem-2));
    int i;
        for(i=-1;i<=(int)(all_mem-2);i++) // << 
        // << properly cast to int
        // otherwise compiler raises warning and unsigned comparison made
    {
        printf("The number is %d\n",i);
    }
    return 0;
}
all_mem = 10
The number is -1
The number is 0
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
The number is 6
The number is 7
The number is 8