【问题标题】:For Loop - Compare Unsigned Number With Signed IntegerFor 循环 - 将无符号数与有符号整数进行比较
【发布时间】:2012-12-26 06:39:40
【问题描述】:

我试图在for 循环中将无符号数与有符号数进行比较,但它没有执行 for 循环之后的语句,这意味着 for 循环不起作用,我想。我的代码是:

#include <stdio.h>
int main()
{
   unsigned int i;
   for (i = 8; i >= -1; i--)
     printf ("%d\n", i);
   return 0;
}

在上面的代码中,printf 语句没有被执行,所以我的for 循环有什么问题。我们不能将无符号数与有符号数进行比较吗?

【问题讨论】:

    标签: c for-loop


    【解决方案1】:
    unsigned int i;
    for (i = 8 ; i >= -1; i--)
    

    -1 转换为无符号类型的最大值以进行比较。因此,对于unsigned 值,

    i >= -1
    

    仅适用于 i = UINT_MAX。

    要获得预期的输出,最简单的方法是使用有符号整数,例如int.

    另一种方法是在循环控制中做一些魔术:

    for(i = 8+1; i-- > 0;)
    

    但如果你这样做了,一定要写注释解释异常循环控制代码。

    【讨论】:

    • i-- > 0 太丑了。
    • 我应该写i --&gt; 0吗? ;)
    【解决方案2】:

    如果将变量与大小进行比较,通常最好将变量声明为无符号,以避免此问题。

    编译器在比较有符号和无符号类型时会发出警告,因为有符号和无符号整数的范围不同,当它们相互比较时,结果可能会令人惊讶。如果您必须进行这样的比较,您应该明确地转换其中一个值以与另一个兼容,也许在检查以确保您转换的值有效之后。

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 2016-10-16
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2021-03-28
      • 2014-06-08
      相关资源
      最近更新 更多