这是一个向后通过C字符串的循环:
size_t slen = strlen(string);
for (size_t i = slen-1; i >= 0; i--) {
/* do stuff */
}
当我用gcc -Wall -Wextra -std=c99 -o code code.c
编译此代码时,我收到此警告:
警告:无符号表达式> = 0的比较始终为真[-Wtype-limits]
处理此警告时,我改为使用
替换此循环for (int i = (int)slen-1; i >= 0; i--) {
哪个工作正常,但我想知道他们是否有办法让第一个循环仍然编译而没有上面的警告?当我使用-Wextra
进行编译时,此警告似乎只会触发。
答案 0 :(得分:2)
无符号整数永远不能小于0
。这是" unsigned"手段。显然你的循环永远不会终止。
相反,您可以使用:
for (size_t i = slen; i-- > 0; ) {
这在递减i
之前执行测试,因此循环的最后一次迭代将与i == 0
一起发生,然后测试i-- > 0
失败,从而打破循环。
答案 1 :(得分:2)
这里真正的罪行是你违反了所有循环前进的规则,即使是那些倒退的规则。循环应写成如下:
for (size_t i = 0, e = strlen(string); i != e; ++i) {
const size_t ri = e - i - 1;
/* do stuff with index ri */
}
这种结构使迭代器到反向迭代器关系的-1偏移明显,它避免了任何签名问题,并为你提供了一个免费的圆形计数器。