每当人们询问与编程有关的暂停问题时,人们会回答:"如果你只是添加一个循环,那么你就有了停止程序,因此无法自动完成任务 "
说得通.如果你的程序有一个无限循环,那么当你的程序运行时,你无法知道程序是否仍在处理输入,或者它是否只是无限循环.
但其中一些似乎反直觉.如果我正在编写一个暂停问题求解器,它将源代码作为输入,那该怎么办?rascher@localhost$ ./haltingSolver source.c
如果我的代码(source.c)看起来像这样:
for (;;) { /* infinite loop */ }
Run Code Online (Sandbox Code Playgroud)
看起来我的程序看起来很容易."查看循环,看看条件.如果条件只是基于文字而没有变量,那么你总是知道循环的结果.如果有变量(例如while(x <10)),看看是否这些变量是永远修改的.如果没有,那么你总是知道循环的结果."
当然,这些检查不会是微不足道的(计算指针算术等),但这似乎不可能.例如:
int x = 0
while (x < 10) {}
Run Code Online (Sandbox Code Playgroud)
可以检测到.以及 - 尽管不是轻微的:
int x = 0
while (x < 10)
{
x++;
if (x == 10)
{
x = 0
}
}
Run Code Online (Sandbox Code Playgroud)
那么用户输入呢?这就是踢球者,这就是让程序无法预测的原因.
int x = 0;
while (x < 10)
{
scanf("%d", &x); /* ignoring infinite scanf loop oddities */
}
Run Code Online (Sandbox Code Playgroud)
现在我的程序可以说:"如果用户输入10或更高,程序将停止.在所有其他输入,它将再次循环."
这意味着,即使有数百个输入,也应该能够列出程序停止的条件.实际上,当我编写程序时,我总是确保有人能够终止它!我并不是说由此产生的条件清单是微不足道的,但对我来说似乎并不可能.您可以从用户那里获取输入,使用它们来计算指针索引等等 - 但这只会增加条件的数量以确保程序终止,不会使它们无法枚举. …