【问题标题】:for loop condition always truefor 循环条件始终为真
【发布时间】:2014-03-25 09:29:09
【问题描述】:

我在 C 中有一个 For 循环:

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

现在编译器抱怨“由于数据类型范围有限,比较总是正确的” 我知道 255 是 u8 max 但 for 循环必须有条件。那我应该放什么? 谢谢。

【问题讨论】:

  • 你到底想用循环做什么?永远迭代还是在 255 处停止?
  • 我想从 0 -> 255 循环并停止在代码中
  • 迭代给定类型的所有个可能值通常非常困难,除非您可以访问一些严格更宽的类型(不保证存在)。

标签: c for-loop types range


【解决方案1】:
uint8_t i=0;
do {
    //code
}while(++i);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      u8 i=0,iold;
      do{
          //code
          iold=i++;
      }while(iold<i);
      

      【讨论】:

      • 由于do-while 循环,您实际上并不需要iold,您只需检查i 是否变为零。
      【解决方案4】:
      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类型的返回值,否则如何区分它是breaki == 0还是循环从来不是break
      • @ouah:我不知道他的返回值是什么意思,他只提到返回值的类型是u8
      • @dreamlax 但for 永远不会在这里结束。 i&lt;=255i&lt;256 有什么区别?
      • 好吧,除非他在中间突破,否则我们肯定会知道i不是256
      • @mangusta:for 当然会结束,int 保证能够保存大于 255 的值。
      【解决方案5】:

      for 循环不一定需要条件。如果你想让循环根本没有任何条件,你可以这样写:

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

      for (i = 0; ; i++)
      

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

      如果您不希望它无限循环,请在循环内的某处放置 break;,或在 for 循环的条件字段内使用适当的条件。

      老实说,我不确定为什么您的编译器甚至抱怨某个条件始终为真...

      【讨论】:

      • 重新。 “不知道为什么你的编译器会抱怨”,比较的是一个涉及循环variable的循环条件——当他们打算创建一个无限循环时,似乎不太可能有人故意编写该代码。跨度>
      • @Arkku 好吧,是的,编译器会考虑将这些情况告知用户;但显然它不仅仅是通知它,因为 OP 来到这里抱怨地询问它。如果它只是一条信息性消息,那就太好了,如果它需要用户采取额外的行动才能继续,那就是过度干扰。
      • 是什么让您认为他们需要“采取额外行动才能继续”?该消息只是一个警告,它不会(默认情况下)导致任何类型的失败。在任何情况下,程序员都需要采取行动来修复错误——这就是问题所在。
      • @Arkku 为什么突然变得如此咄咄逼人?正如我所说,如果编译器只是通知,那很好。您可以在上一篇文章中以“since ...” 开头的部分找到您的unkind 问题的答案。有些人很奇怪,我必须说...
      • 对于造成的任何冒犯,我深表歉意,我只是想简洁地指出事实,即编译器会对此发出警告是有正当理由的,而警告不会(通过default) 等于需要采取措施的错误,在这种情况下,警告指示需要修复的真正错误,这需要采取措施。仅此而已,也没有什么私人的。
      【解决方案6】:

      那我应该放什么?

      使用较大的类型,例如 int 类型。

      【讨论】:

      • 谢谢,但我不能这样做,因为 var i 将返回函数,它应该是 u8。
      • @Maluvel 如果你想返回i请展示整个函数
      • 谢谢,我将使用更大的类型并在返回时转换回 u8 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多