我正在查看一些C代码,我发现了这一行。
if (temp==NULL)
while (1) ;
根据我的理解,当你进入一个无限循环时,除非你打破,否则没有出局,这是如何工作的?如果if语句不为NULL,它是否会中断,如果是这样,是什么让它一遍又一遍地检查if语句?
有关更多信息,请查找realboy源代码,该文件为gboy_lcd.c
线304
https://github.com/guilleiguaran/realboy/blob/ed30dee751c3f78964e71930a8f87d2074362b9b/gboy_lcd.c
虽然对于Linux来说它是一个非常稳定和优秀的gameboy模拟器
答案 0 :(得分:6)
基本上有人正在停止该计划。如果temp为NULL,则程序将在while语句中进入无限循环。我希望在代码中看到一条评论,说明他为什么要这样做。
这在嵌入式/微代码(即运行电视机,冰箱,烟雾探测器等的代码)中很常见,因为无法停止/崩溃/警报。你唯一能做的就是循环。在开发过程中,您可以使用调试器来查看代码以查看发生的事情
PS - 为什么是downvotes-这是一个很好的问题
答案 1 :(得分:5)
如果temp
为NULL
,则此代码会启动while循环。
while循环一遍又一遍地计算表达式(1),并且每次都不执行任何操作,直到1!= 1,这将永远不会发生。
用Allman支撑写得更清楚了:
if (temp == NULL)
{
while(1)
{
}
}
正如评论中所指出的,此版本显示if
不属于while
。
答案 2 :(得分:2)
一旦完成检查并进入while循环,就无法检查temp的值。
答案 3 :(得分:1)
假设没有外部中断发送到进程/线程,如果if块成功,while循环实际上将永远运行。你是对的:没有摆脱那个循环。
要实际确定这是否有用,需要更多的上下文。
答案 4 :(得分:1)
我写了这个模拟器,虽然你看的版本已经很老了,但我还没有摆脱这个'缺陷'。请看一下这里:http://sourceforge.net/p/realboy/code/ci/master/tree/src/gboy_video.c
现在称为违规功能' vid_frame_update()'。具体来说,第141行。随着超级游戏男孩的支持,这个'缺陷'也在第102行复制。
如果你看一下第168行的功能(' vid_start()'),你会看到' temp'的可能(指针)值。一次性分配(这些是x1到x4和sgb_1到sgb_4),所以应该在这里进行错误分配的测试。然而,我记得我有一些奇怪的行为并添加了“瑕疵”。仅用于调试目的。
我很抱歉给您带来不便,但我很高兴这件事发生了,因为我从来没有像这样微不足道的事情可能是混乱的源头(也许我只是从来没有人会真正看到代码)。下次最好小心点,呵呵!
感谢。
答案 5 :(得分:0)
这应该更容易理解,一旦if
成功,它进入while循环,在一个连续的循环中迭代,
if (temp==NULL){
while (1) { }
}