2013-01-22 51 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總有一個讓我感到奇怪,但是不是另一個。 –

相關問題