【问题标题】:How do unsigned int behave with while loop?unsigned int 如何处理 while 循环?
【发布时间】:2017-09-27 10:47:55
【问题描述】:

我有一小段代码,但我无法理解可能的输出是什么?

int main()
{
    unsigned int i=65000;
    while ( i++ != 0 );
    printf("%d",i);
    return 0;
}

我可以感觉到后增量在循环中发挥着重要作用,但我无法想象它。在达到最高正值后,无符号整数在 while 循环中的行为是否不同?最后,while循环后分号的目的是什么?

【问题讨论】:

  • 无符号整数溢出is defined in C,基本上是环绕。
  • 编译运行?
  • @InderRSingh 无符号类型没有符号位
  • @InderRSingh 你把我的名字弄错了,尽管它是自动完成的,无论如何我认为我读得很清楚——也许你的 cmets 不清楚。没有符号位,所以它与这里发生的事情无关。当然,unsigned int 可以的最高位是 1。
  • @InderRSingh:你的 cmets 没有意义。正如哈罗德所写,无符号整数没有符号位。您可能会将它们与具有符号位的正符号整数混淆,但这不一定是存储单元中的最高位。有符号整数溢出也是调用未定义行为的经典方法之一。这与 Linux 操作系统完全无关

标签: c while-loop unsigned-integer post-increment


【解决方案1】:

定义了无符号整数溢出(见Why is unsigned integer overflow defined behavior but signed integer overflow isn't?),这段代码可能会终止(可能需要一些时间:见下文)。

但是,int 的大小因平台而异。如果它是 16 位(一些旧的编译器),它将很快达到最大值 65535 并在换行时终止。但是,如果它是 32 位(GCC 和许多),则需要一段时间才能溢出它。它也可以优化,因为它没有副作用:见下文。

while 语句后的分号终止表达式,这意味着循环不执行任何操作并允许优化 while

最后,输出将是1

【讨论】:

  • 我认为输出是 1(试试看),因为 i 有一个后缀增量。
  • 纠正了事情。
  • geeksforgeeks.org/output-of-c-programs-set-6 看到这里他们说输出为 1。尝试在他们的 IDE 上运行,但它说:“超过 5 秒的时间限制”
  • 当然,如果您允许公众运行程序,您将对这些程序设置时间限制。您不希望人们能够使您的系统崩溃。因此程序没有完成,因为它超时了
  • @f__society 使用 32 位 int 在我的 PC 上运行您的程序大约需要 7 秒。
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2018-11-13
相关资源
最近更新 更多