繁体   English   中英

为什么这个 size_t i = size 变量在 for 循环中使用时给出“垃圾”值?

[英]Why does this size_t i = size variable giving "garbage" value when used in for loop?

我已经将 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("%lu\n",i);
    }

gcc -Wall -Wextra打来电话说你好:

警告:'>= 0' 中无符号表达式的比较始终为真 [-Wtype-limits]

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


现在在这种情况下发生的是无符号整数有明确定义的环绕。 当超过 0 时, size_t将因此获得一个非常大的整数值。

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

实际上,在具有 8 位long的系统上,您可能会得到诸如 18446744073709551615 之类的输出,但这不能保证,因为它是一个错误。 在任何一种情况下,它都是一个永恒的循环,它将挂起程序。

i >= 0 始终为真,因为 i 是 size_t 并且不能低于 0

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

如果将 size_t 递减为 0,则此 size_t 将获得 size_t 的最大可能值。

如果您希望打印 0,您可以使用 i > 0 代替或使用for(int i = 6;i >= 0;--i)

PS: %zu 用于 size_t 和 %d 用于 int (或 %i , %d 用于十进制整数输入)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM