【问题标题】:C while loop only runs if statement true?C while 循环仅在语句为真时运行?
【发布时间】:2014-04-11 06:28:16
【问题描述】:

我正在查看一些 C 代码,我发现了这一行。

if (temp==NULL)
    while (1) ;

据我了解,当您进入无限循环时,除非您中断,否则无法退出,这是如何工作的?如果 if 语句不为 NULL,它会中断吗?是什么让它一遍又一遍地检查 if 语句?

有关更多信息,请查找文件是 gboy_lcd.c 的 realboy 源代码

304线
https://github.com/guilleiguaran/realboy/blob/ed30dee751c3f78964e71930a8f87d2074362b9b/gboy_lcd.c

这是一个非常稳定和优秀的 linux 游戏机模拟器

【问题讨论】:

  • 正确,一旦你陷入了那个while循环,你就永远处于其中。或许 if 语句应该在 while 循环中,但您仍然需要一个 BREAK。
  • 用源文件更新了问题,它似乎完美地工作我没有编码,只是第一次看到这样的东西。

标签: c loops if-statement while-loop


【解决方案1】:

如果tempNULL,此代码将启动一个while 循环。

while 循环一遍又一遍地计算表达式 (1) 并且每次都不执行任何操作,直到 1 != 1 永远不会发生。

用奥尔曼支撑写得更清楚了:

if (temp == NULL)
{
    while(1)
    {
    }
}

正如评论中指出的那样,此版本表明if 不是while 的一部分。

【讨论】:

    【解决方案2】:

    一旦检查完成并进入 while 循环,就无法返回检查 temp 的值。

    【讨论】:

      【解决方案3】:

      假设没有外部中断被发送到进程/线程,如果 if 块成功,while 循环实际上将永远运行。你是对的:没有摆脱那个循环。

      要真正确定这是否是一个有用的行为,需要更多的上下文。

      【讨论】:

        【解决方案4】:

        基本上有人正在停止程序。如果 temp 为 NULL,则程序将在 while 语句上进入无限循环。我希望在代码中看到一条评论,说明他这样做的原因。

        这在嵌入式/微代码(即运行电视机、冰箱、烟雾探测器等的代码)中很常见,因为没有办法停止/崩溃/警报。你唯一能做的就是循环。在开发过程中,您可以使用调试器来中断代码以查看发生了什么

        PS - 为什么投反对票 - 这是个好问题

        【讨论】:

        • 这是有道理的,所以无论如何都不会考虑进入 temp,但如果它这样做了,那么这会使程序冻结,让我觉得好像出了点问题
        • 不能输入信号处理器吗?
        • 我不是专家,但 micros 不是经常需要调用 HALT 或 RESET 指令吗?我没想到这里会出现无限循环。我认为这会使芯片变热。
        【解决方案5】:

        这应该更容易理解,一旦if成功就进入while循环,在一个连续的循环中迭代,

        if (temp==NULL){
          while (1) { }
        }
        

        【讨论】:

          【解决方案6】:

          我写了这个模拟器,虽然你看到的版本很旧,但我还没有摆脱这个“缺陷”。看这里:http://sourceforge.net/p/realboy/code/ci/master/tree/src/gboy_video.c

          有问题的函数现在称为“vid_frame_update()”。具体来说,第 141 行。随着对 Super Game Boy 支持的添加,这个“缺陷”也在第 102 行复制。

          如果你看一下第 168 行的函数('vid_start()'),你会发现 'temp' 的可能(指针)值是一次性分配的(这些是 x1 到 x4 和sgb_1 到 sgb_4),所以应该在这里进行错误分配的测试。然而,我记得我有一些奇怪的行为,并添加了“缺陷”仅用于调试目的。

          对于给您带来的不便,我深表歉意,但我很高兴这件事发生了,因为我从来没有想过像这样的微不足道的事情会引起混乱(也许我只是从来没有想过有人会真正查看代码)。下次小心点,呵呵!

          谢谢。

          【讨论】:

            猜你喜欢
            • 2017-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-26
            • 2014-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多