悬空其他歧义
编译器和解释器使用语法来构建数据结构以处理程序。所以理想情况下,一个程序应该有一个派生树。解析树或派生树是一种图形表示,它显示了语法的字符串是如何使用产生式规则派生的。但是存在一些模棱两可的字符串。
如果输入字符串存在多个最左推导或多个最右推导或多个分析树,则称该文法不明确。模棱两可的语法或字符串可以有多种含义。歧义通常被视为语法错误,在编程语言中,这大多是无意的。
悬空其他歧义
句法歧义中的悬空 else 问题。当我们使用嵌套 if时会发生这种情况。当有多个“if”语句时, “else”部分并不清楚它应该与哪个“ if ”组合。
例如:
if (condition) {
}
if (condition 1) {
}
if (condition 2) {
}
else
{
}
在上面的例子中,有多个带有多个条件的“ ifs” ,在这里我们想要将最外面的 if 与 else 部分配对。但是 else 部分并没有清楚地看到它应该与哪个“ if”条件配对。这会导致编程中出现不适当的结果。
Dangling-else 的问题:
悬空 else 会导致严重的问题。它可能导致编译器的错误解释并最终导致错误的结果。
例如:
Initialize k=0 and o=0
if(ch>=3)
if(ch<=10)
k++;
else
o++;
在这种情况下,我们不知道变量“ o ”何时会递增。第一个“ if ”条件可能无法满足,或者第二个“ if ”条件可能无法满足。即使第一个“ if ”条件得到满足,第二个“ if”条件也可能失败,这可能导致“ else”部分的执行。因此,它会导致错误的结果。
为了解决这个问题,C、C++、 Java等编程语言将“ else”部分与最里面的“ if”语句结合在一起。但有时我们希望最外面的“ if”语句与“ else”部分结合起来。
解决悬空问题
第一种方法是设计明确的编程语言。
其次,我们可以通过使用大括号和缩进来解决编程语言中的 dangling-else 问题。
例如:
if (condition) {
if (condition 1) {
if (condition 2) {}
}
}
else {
}
在上面的示例中,我们使用了大括号和缩进以避免混淆。
第三,我们还可以使用“if-else if-else”的格式,来具体指明哪个“ else”属于哪个“ if” 。
例如:
if(condition) {
}
else if(condition-1) {
}
else if(condition-2){
}
else{
}