【问题标题】:how many times will an unsigned Char loop run无符号字符循环将运行多少次
【发布时间】:2011-09-20 11:07:18
【问题描述】:

我是 C/C++ 的菜鸟,所以请原谅这个问题的简单性,但这里是

unsigned char i;
for (i=0; i<1000; ++i)
  if ((i%4) == 0)
    printf("hello\n");

代码将打印多少次“hello”。我说 63,但可惜它不是选项之一。有人可以提供答案,但更重要的是解释原因

【问题讨论】:

标签: c++ c for-loop


【解决方案1】:

注意:我假设 8 位字符类型。

当你对i执行++i等于255时,你会溢出。此时语言标准规定i变为0,这种现象通常称为回绕。

所以,你有一个无限循环,因为i&lt;1000 的所有值都是i

【讨论】:

  • -1 以补偿对错误答案的错误投票;-) 溢出 unsigned char 不是未定义的行为,但答案在其他方面是正确的。如果UCHAR_MAX 等于INT_MAX,我认为你会得到UB,但这将是一些奇怪的实现。
  • 哈!您需要投反对票约 5 次以补偿我的投赞成票:P
  • @Steve 对不起。行为的标准定义是什么?我不妨学点东西。
  • @David:在 C++ 和 C 中,将超出范围的值转换为无符号类型会产生模 UWHATEVER_MAX+1 的值。所以在这种情况下,如果unsigned char 是 8 位,则取模 256。那么,UB 的可能性很小,如果 i+1 被提升为 int 并在它甚至有机会被模回到 unsigned char 的范围之前溢出。
  • @David:我假设没有证据表明这是从一开始就考虑硬件的问题——要么是某台机器捕获越界的有符号算术但不是无符号的,要么做使用符号幅度表示(其中溢出的有符号值 INT_MAX+1 不能以模 2*(INT_MAX+1) 表示)。
【解决方案2】:

我会敦促您通过运行代码来进行实验。如果这不能解决问题,请尝试打印出条件为真的i 的值。如果您随后发现 i 的值发生了任何异常变化,请考虑可能的原因。

【讨论】:

    【解决方案3】:

    答案是无限时间,无符号字符的范围在 0-255(1 个字节)之间,超过 255 会溢出并返回 0,这意味着它永远不会达到 1000 ..因此无限循环

    【讨论】:

    • 接受的答案明确指出假设是关于 8 位字符。
    【解决方案4】:

    在这里,您将“i”清除为 unsigned char,其范围小于 1000,其大小为 1 字节 (0-255),当它再次达到 255 时,它会递减,然后在任何情况下该值都不会超过 1000 bcoz” i" 的范围仅为 0-255。

    所以 for 循环不会失败 n 不确定地执行

    希望你明白我的意思……!!!!!!!!!!!!

    【讨论】:

      【解决方案5】:

      我说 0 - 不是“你好”,而是“你好”:-)

      但现在是真实的:i 的值是 0、1、2、... 999。这些是 1000 个值。

      什么时候打印字符串?如果i 是 0、4、8、12,... - 所以每 4 个循环周期一次。

      --> 在 1000 个循环周期内,它被打印 250 次。

      如果没有 unsigned char 作为数据类型,这将是正确的。

      【讨论】:

        【解决方案6】:

        无限时间“你好”打印,因为原因很简单,无符号字符有一个上限为 255,如果你再次增加它,它们将变为零,然后它们再次达到 255 然后为零,所以变量我永远不会达到 1000我们称之为无限循环。

        【讨论】:

          猜你喜欢
          • 2013-08-05
          • 2012-10-19
          • 2021-10-04
          • 2022-11-15
          • 2019-04-30
          • 2021-11-17
          • 1970-01-01
          • 2017-06-20
          • 2019-04-13
          相关资源
          最近更新 更多