循环条件始终为真

4

我在C语言中有一个For循环:

u8 i;
for (i=0; i <= 255; i++)
{
    //code
}

现在编译器报错,提示“比较总是为真,因为数据类型的范围有限”。 我知道255是u8的最大值,但for循环必须有一个条件。那么我应该放什么条件呢? 谢谢。


1
你想用循环做什么?是无限迭代还是在255处停止? - Paulo Bu
我想循环从0到255,并像代码中一样停止。 - Maluvel
通常情况下,要迭代遍历给定类型的所有可能值是非常困难的,除非您可以访问某些严格更宽的类型(这并不保证存在)。 - Kerrek SB
6个回答

7
uint8_t i=0;
do {
    //code
}while(++i);

5

什么是u8?如果它表示8位无符号整数,则255 + 1会再次变为零,因此循环重新开始。您应该使用更大的整数类型或者按照回复中建议的使用do-while


3
u8 i=0,iold;
do{
    //code
    iold=i++;
}while(iold<i);

由于使用了 do-while 循环,实际上不需要 iold,只需检查 i 是否变为零即可。 - Arkku

3
u8 someFunction()
{
    int i;
    for (i = 0; i < 256; i++)
    {
        // do something with i here and /or break
    }

    if (i == 256)
    {
        // loop ran completely without a break
    }

    return i; // will convert i to "u8" type (256 will become 0)
}

然后他需要一个返回类型为 int 的返回值,否则如何区分它是在 i == 0 处中断还是循环从未被中断? - ouah
@ouah:我不知道他使用返回值的意图是什么,他只提到了返回值的类型是 u8 - dreamlax
@dreamlax 但是 for 在这里永远不会结束。i<=255i<256 之间有什么区别? - mangusta
好的,除非他在中途退出,否则我们肯定会知道i不是256。 - mangusta
@mangusta:当然,for循环会结束,int保证能够容纳大于255的值。 - dreamlax
啊,那是“int”,抱歉:) - mangusta

3

for循环不一定需要条件。如果您希望循环根本没有条件,可以编写以下代码:

for (i = 0; 1 ; i++)

或者

for (i = 0; ; i++)

但要注意,i 在达到255后会溢出,并每次从零重新开始。

如果您不希望它无限循环,则可以在循环内部放置一个 break;,或者在 for 循环的条件字段中使用适当的条件。

说实话,我不确定为什么您的编译器会抱怨条件始终为真...


关于“不确定为什么编译器会抱怨”,比较是涉及循环变量的循环条件 - 当有意创建无限循环时,似乎不太可能有人故意编写这样的代码。 - Arkku
@Arkku 嗯,是的,编译器告知用户这种情况会很周到;但显然它不仅仅是告知,因为 OP 来这里抱怨了。如果只是一条信息提示那就很好,但如果需要用户采取额外措施才能继续,那就有些过度干涉了。 - Utkan Gezer
你觉得他们为什么需要“采取额外的行动来继续进行”?这个消息只是一个警告,它默认情况下不会导致任何失败。无论如何,程序员都需要采取修复错误的行动——这也是问题所在。 - Arkku
@Arkku,为什么突然变得这么激进?就像我说的,如果编译器只是提供信息,那就没问题。你可以在之前的帖子中找到对你不友善问题的答案,在以“自从…”开头的部分中。有些人真是奇怪,我必须说… - Utkan Gezer
对于造成的任何冒犯,我深感抱歉。我只是想简洁地指出事实,即编译器发出警告是有合理原因的,并且警告并不(默认情况下)等同于需要采取行动的错误。在这种情况下,警告指示了一个真正需要修复的错误,需要采取行动。没有其他意思,也没有个人恩怨。 - Arkku

2

那我应该放什么?

使用一个更大的类型,比如int类型。


谢谢,但我不能这样做,因为变量i将是函数的返回值,它应该是u8。 - Maluvel
@Maluvel 如果你想返回 i,请展示整个函数。 - ouah
谢谢,我会使用更大的类型并在返回时转换回u8 :) - Maluvel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接