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的块终止方法。句法细节不是很重要,但语义是关键
考虑几个例子,说明块终止是如何用其他语言表示的:
- Erlang和Prolog:lambda和条件的关键字
end
,函数定义的句号
,以及、
和代码>用于短语分离
- Python、YAML、“缩进模式”Haskell和RyuQ:块终止用缩进(语义空白)表示
- Ruby和Elixir:块终止用关键字
end
表示。很像艾达
- Algol和sh/Bash/破折号:使用起始关键字的匹配反转表示块终止。因此,
如果
以fi
终止,案例
以esac
终止
- Rust、C、C++、D、Java、JavaScript/ECMA脚本,等等:使用关键字和左括号
{打开所有块,并使用右括号关闭所有块,以便于识别块的关闭标记(由一个相对幼稚的解析器(不一定是人类读者)编写)
(
(本质上是指“开始评估”)打开的,而列表是用”(
(本质上是指“我是一个列表,但跳过评估我”)打开的并且所有的都用一个关闭参数关闭。)
)都会被一个匹配的标记终止,该标记带有一个结束斜杠指示符,如
(或者有时只是
,由于一些重要原因,这会稍微好一点)。大多数尖括号疯狂的变体现在也支持“自动关闭”标记,其中结束斜杠可以作为一种简写形式存在于开始标记的末尾,因此像
这样属于自己短语的空标记可以缩短为
,或者有时缩短为
,这取决于它碰巧是什么样的疯狂味道。(很明显,有一个问题会被这种模糊性所吸引。){}
大括号分隔的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;