2013-01-22 32 views
3

我不知道为什么有像+=-=++-=,在阿达<<=x ? y : z(不是增量赋值 ...)没有运营商?其他许多语言(C,C++,C#,Java,Perl)都有它们。为什么Ada中没有(增强赋值)运算符,如+ =, - =或++?

- 实施例(C/C++/...):

int a = 3; 

a += 4; /* A */ 
// long: a = a + 4 

a++; /* B */ 
// long: a = a + 1 

a = (a > 3 ? 10 : 5); /* C */ 
// long: ' if a > 3 then a = 10 else a = 5' 

- 实施例(ADA):

a : integer := 3; 

a := a + 4; -- A -- 
a := a + 1; -- B -- 

if a > 3 then -- C -- 
    a := 10; 
else 
    a := 5; 
end if; 

(实施例没有意义 - 仅用于演示)

是因为...

  • 运算符重载(但C++也有这样的机制)?
  • 可读性?
  • 技术原因/限制?
  • 这只是一个把这些表达式缩短而不是编程所需的技巧?
  • Ada中的赋值运算符是:=而不是=(所以+= - >+=:)?
+4

虽然这个问题似乎在提问和倡导之间划清界线,但我认为这是一个合理的问题(甚至有答案,查看理由),所以我不同意接近的决定。对于T.E.D. –

+2

+1。尽管我支持我的回答,但我一直有兴趣查看并理解其他观点 –

+1

+1对于泰德和布莱恩;我也想看到这个问题的其他观点... – clx

回答

19

由于小梅的设计是从数学采取更加紧密地比其他一些语言......等等......

赋值不是一个运营商

运营商具有的特殊性能 - 它们按照返回结果的数量进行操作 - 同时使数量本身保持不变。

这很重要 - 严格遵守对“操作员”的理解,并且可以进行大量优化,因为语义更具可预测性。基本上,操作员不会有副作用。您可以重复它们或将重复的因子重新排序,并且您可以更自由地重新排列表达式而不更改结果。

如果您将操作员的任务分配错误......基本上,您已经搞错了。 只有一个带有副作用的“操作员”意味着你失去了所有操作员的宝贵财产...为了什么?一些符号方便性,臭虫滋生的巨大温床,没有额外的性能或效率。

顺便说一句,当我不得不闲逛内GCC最近我发现其表达分析的功能,明确打破了(中间表示)a++并转化它内部成(中间表示)a = a + 1;所以较短的形式确实没有似乎更有效率!

对函数的适用(对Ada比VHDL更严格) - 它们只是运算符的另一个伪装,而纯函数(在VHDL中,每个函数都在其声明中没有“不纯”字)!有副作用。这也是为什么Ada同时具有函数和过程的原因:函数,运算符和表达式本质上是相似的(理想状态下无状态和副作用);程序,作业和陈述是一个单独的类别(程序调用和作业是陈述的形式)。

分离的概念,并使用适当为每个任务走一段很长的路要走作出明确的程序,你可以理解,也许你打算什么...

哦和Ada-2012终于赶上了VHDL-2008和大陵W(1963)与如 - 和案例表达式...

a := (if a > 3 then 10 else 5); 
-- to my eyes MUCH more readable than ?: especially in multiple if-exprs! 

b := (case a is 
     when 3 => 5; 
     when 6|7 => 10; 
     when others => 0); 

显而易见的是,这里的任务仍然语句...

只是为了确保:

赋值不是一个运营商

阿达的设计师有什么不会影响完整性是可能的,什么只会导致一个烂摊子令人印象深刻的,通常很清晰的把握。虽然增加了更新的语言功能,但随着编译技术的发展足以使其可靠,它一直是一个谨慎的过程,Ada-83子集仍然几乎完好无损。

+0

谢谢你的回答!到目前为止还没有看到这个问题的答案 - 但这包含了我想知道的所有内容。 – ollo

+0

Btw。那些* if/case * asignemts真的很棒,以前没见过。因此,不需要做'?:'。 – ollo

+0

C总有一个让我感到奇怪,但是不是另一个。 –

相关问题