c语言 - 为什么这size_t i = size 变量在 for 循环中使用时给出"garbage"值?



我将size定义为传递的值6,跟踪"size"也产生了6,但是当我使用size,甚至直接使用6来初始化I,但是在for循环中,I的值会被丢弃。在这种情况下,我只是初始化6的值,以便于解释。据我所知,size_t类似于unsigned int或unsigned long int,具体取决于编译器

for (size_t i = 6 ; i >= 0; --i){
printf("%lun",i);
}

gcc -Wall -Wextra打电话打招呼:

警告:无符号表达式的比较"祝辞= 0"总是正确(-Wtype-limits)

帮你自己一个忙,停止搜索编译器已经发现的错误,遵循以下建议:对于初学者学习C,推荐哪些编译器选项?


在这种情况下,无符号整数有很好的绕行。因此,当超过0时,size_t将得到一个非常大的整数值。

然后你对printf撒谎,说你传递的是signed long,而实际上你传递的是一个无符号的size_t。严格来说,这是未定义的行为,任何事情都可能发生。正确的转换说明符是%zu

在具有8位long的系统上,您可能会得到这样的输出18446744073709551615,但这不能保证,因为这是一个bug。在这两种情况下,它都是一个将挂起程序的永恒循环。

i>= 0总是为真,因为i是size_t,不能小于0

循环不会终止,这取决于你的编译器是否接受

如果size_t等于0,则该size_t将获得size_t的最大可能值。

可以使用i>0代替或使用for(int i = 6;i >= 0;--i)如果你想打印你的0

PS: %zu表示size_t, %d表示int(或者%i, %d表示十进制整数输入)

最新更新