把每条指令视为一个结点,按语义连出控制流图(有向图):
label / print:若不是最后一条,则连到下一条;goto L:连到标签 L 对应行;gotorand L1 L2:分别连到 L1、L2;halt 以及“落到程序末尾”(最后一行的 label/print 没有下一条):无出边(终止)。在计算机科学中,循环是程序设计的基本构造之一用于重复执行一段代码,直至满足某个停止条件然而不当设计的循环可能导致无限循环,即程序陷入一个永不停止的执行状态,这是软件错误的一种常见形式
编译器优化与错误检查:编译器在生成目标代码前会进行循环检测,以优化循环结构并避免潜在的无限循环错误。
静态代码分析工具:这类工具扫描代码,帮助开发者发现包括无限循环在内的多种潜在问题。
现有一种编程语言,只有以下五种命令,每种命令最多有两个参数。
这些命令分别是:
label〈string〉:声明一个标签,参数是一个字符串,且每个标签只声明一次。
goto〈string〉:跳转到一个标签,并从标签处开始按顺序执行程序。
halt :停机,程序终止。
print〈string〉:打印一个字符串,并执行下一个命令。
gotorand<label1><label2>:随机跳转到两个标签中的一个,并从标签处开始按顺序执行程序。
当程序执行完最后一句,且没有跳转时,程序终止。
请检查给定的程序是否 可能 无限循环
第一行为给定的程序的命令条数为 n,n<100 。
后面 n 行为程序的指令。
所有标签中只含有英文字符,并且长度少于 10 。
print 命令的字符串只含有英文字符,并且长度少于 20 。
如果程序可能出现死循环输出 true,否则输出 false 。
输入
6
label start
print "hello world!"
gotorand start end
print "good bye”
halt
label end
输出
true
说明
每当程序执行到第三句 “gotorand start end" 后,都有可能回到第一句,从头执行,也可能跳到最后一句。
当跳转到第一句会出现死循环,因此输出 true 。
输入
2
label start
print "hello world!"
输出
false