我将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表示十进制整数输入)