C while 循环仅在语句为真时运行?
Posted
技术标签:
【中文标题】C while 循环仅在语句为真时运行?【英文标题】:C while loop only runs if statement true? 【发布时间】: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。 用源文件更新了问题,它似乎完美地工作我没有编码,只是第一次看到这样的东西。 【参考方案1】:如果temp
是NULL
,此代码将启动一个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),所以应该在这里进行错误分配的测试。然而,我记得我有一些奇怪的行为,并添加了“缺陷”仅用于调试目的。
对于给您带来的不便,我深表歉意,但我很高兴这件事发生了,因为我从来没有想过像这样的微不足道的事情会引起混乱(也许我只是从来没有想过有人会真正查看代码)。下次小心点,呵呵!
谢谢。
【讨论】:
以上是关于C while 循环仅在语句为真时运行?的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:循环结构(循环类型(while,do...while,for,嵌套循环),循环控制语句(break,continue,goto),无线循环(死循环))