If statement Ada中的end if语句比其他语言有什么优势

If statement Ada中的end if语句比其他语言有什么优势,if-statement,ada,conditional-compilation,If Statement,Ada,Conditional Compilation,大多数其他编程语言在条件语句的末尾不需要end if语句 if boolean_expression then statement else statement 如果提供了其他语言所没有的Ada,那么包含end有什么好处 if boolean_expression then statement else statement end if 如果条件为真(跳过代码的else部分),我认为这与分支预测有关,但我不确定。考虑一个嵌套的if,如下所示:如果是布尔表达式,那么如果是另一个布尔表达式,那么

大多数其他编程语言在条件语句的末尾不需要
end if
语句

if boolean_expression then statement else statement
如果提供了其他语言所没有的Ada,那么包含
end有什么好处

if boolean_expression then statement else statement end if

如果条件为真(跳过代码的else部分),我认为这与分支预测有关,但我不确定。

考虑一个嵌套的
if
,如下所示:
如果是布尔表达式,那么如果是另一个布尔表达式,那么是语句else语句

现在,
else
部分属于哪个
if
语句

如果
解决了问题,则结束(为清晰起见缩进):

或:

TL;博士: 它没有特别的优势,但它是任何允许块声明的语言的必要部分

Ada的块终止方法非常明确,但这并没有传达任何特殊的优势

讨论 正如其他人所指出的,这只是Ada的块终止方法。句法细节不是很重要,但语义是关键

考虑几个例子,说明块终止是如何用其他语言表示的:

  • ErlangProlog:lambda和条件的关键字
    end
    ,函数定义的句号
    ,以及
    用于短语分离
  • PythonYAML、“缩进模式”HaskellRyuQ:块终止用缩进(语义空白)表示
  • RubyElixir:块终止用关键字
    end
    表示。很像艾达
  • Algolsh/Bash/破折号:使用起始关键字的匹配反转表示块终止。因此,
    如果
    fi
    终止,
    案例
    esac
    终止
  • RustCC++DJavaJavaScript/ECMA脚本,等等:使用关键字和左括号
{打开所有块,并使用右括号关闭所有块,以便于识别块的关闭标记(由一个相对幼稚的解析器(不一定是人类读者)编写)
  • Lisp和朋友:一般来说,一切都是列表形式的语义表达式,所有评估块都是用
    (本质上是指“开始评估”)打开的,而列表是用
    ”(
    (本质上是指“我是一个列表,但跳过评估我”)打开的并且所有的都用一个关闭参数关闭。)
  • XMLHTMLSGMLXSLT,以及其他醒着的噩梦:每个(可能是任意的)打开标记(如
    )都会被一个匹配的标记终止,该标记带有一个结束斜杠指示符,如
    (或者有时只是
    ,由于一些重要原因,这会稍微好一点)。大多数尖括号疯狂的变体现在也支持“自动关闭”标记,其中结束斜杠可以作为一种简写形式存在于开始标记的末尾,因此像
    这样属于自己短语的空标记可以缩短为
    ,或者有时缩短为
    ,这取决于它碰巧是什么样的疯狂味道。(很明显,有一个问题会被这种模糊性所吸引。)
  • 等等

    正如我们所见,Ada的块终止表达式一点也不奇怪——它只是比括号中的语言更显式(比Erlang和Prolog稍微显式).无论如何,在不使用GOTOs或其他形式的显式跳转表达式的情况下,绝对有必要能够定义逻辑块,这意味着也有一个明确的方法来终止它们。这只是Ada的方法

    增编:关于“积木”的说明 正如flyx善意地指出的,语句、块、表达式、过程、子程序和函数之间有一个有趣的区别。有些语言具有所有这些,有些语言只有函数和表达式,有些语言具有任意混合

    C(及其后代)对“语句”和“表达式”进行了区分,对于由
    {}
    大括号分隔的C样式块,语言将处理该“块”也就是说,它不会像表达式那样返回值,而是希望语句本身所表示的过程的执行会对程序产生一些有意义的影响

    那么这在语法上意味着什么呢

    在Ada中,
    if
    显式打开一个块

    然而,在C中,
    if
    根本不打开或声明任何内容——它只是保护下一条语句。因此,C中的一行
    if
    是完全正常的——根本不需要关闭括号,因为没有打开任何括号。然而,如果,
    if
    后面的语句需要是多行语句(请注意,在C中为每一条多行语句定义函数有点单纯形)

    if (x) do_something();
    
    看,妈妈,没有括号

    前者更常见,因为大多数条件分支不止一行

    这一特定问题变得有点含糊不清(现在您确实遇到了分支预测问题),原因是:

    或者Python最近添加的三元运算符:

    opening_time = 12 if day == 'sunday' else 9
    
    一个等价物(在某种程度上是单向的C):

    等等

    在这里,我们了解了未命名代码块的一些早期用途,以及在一些(但不是所有)语言中如何将它们视为复合语句。

    Ada语言
    if (x) {do_something();}
    
    if (x) do_something();
    
    int opening_time = (day == SUNDAY) ? 12 : 9;
    
    opening_time = 12 if day == 'sunday' else 9
    
    int opening_time = 9;
    if (day == SUNDAY) opening_time = 12;
    
    procedure Foo is
    begin
        if condition then 
        -------------------
        -- a lot of code...
        -------------------
        end if;
    end Foo;