表達:計算值的值。例子:1+2/x
聲明:做某事的代碼行。例子:后藤100
在最早的通用編程語言(如FORTRAN)中,區別是非常清楚的.在FORTRAN中,語句是一個執行單位,是您所做的事情。它沒有被稱為“行”的唯一原因是因為它有時跨越多行。一個表情本身不能做任何事情.。你必須把它賦值給一個變量。
1 + 2 / X
是FORTRAN中的一個錯誤,因為它什么都不做。你必須用這句話做點什么:
X = 1 + 2 / X
Fortran沒有我們今天所知道的語法-這個想法是和Backus-NaurForm(BNF)一起發明的,作為Algol-60定義的一部分。在這一點上語義“有價值”與“做某事”的區別體現在句法一種短語是表達式,另一種是語句,解析器可以區分它們。
后來語言的設計者模糊了這種區別:他們允許句法表達式來做事情,他們允許有價值的句法語句?,F存最早的流行語言例子是C。C的設計者意識到,如果允許對表達式進行評估并丟棄結果,就不會造成任何傷害。在C中,每一個句法表達式都可以通過在結尾加上分號來生成語句:
1 + 2 / x;
是一個完全合法的聲明,即使絕對不會發生任何事情。類似地,在C中,表達式可以具有副作用-它可以改變一些東西。
1 + 2 / callfunc(12);
因為callfunc
可能只是做些有用的事。
一旦允許任何表達式成為語句,則最好允許表達式中的賦值運算符(=)。這就是為什么C允許你做這樣的事情
callfunc(x = 2);
這將計算表達式x=2(將值2賦值為x),然后將該表達式(2)傳遞給函數。callfunc
.
表達式和語句的模糊出現在所有C-派生類(C、C+、C#和Java)中,它們仍然有一些語句(如while
)但允許將幾乎任何表達式用作語句(在C#中僅用于賦值、調用、增量和遞減表達式;請參見斯科特·維斯涅夫斯基的回答).
有兩個“句法類別”(這是語句和表達式的類型的技術名稱)可能會導致重復工作。例如,C有兩種形式的條件,語句形式
if (E) S1; else S2;
以及表達形式
E ? E1 : E2
有時人們想要重復是不存在的:例如,在標準C中,只有一條語句可以聲明一個新的局部變量-但是這種能力非常有用,GNU C編譯器提供了一個GNU擴展,它使表達式也可以聲明局部變量。
其他語言的設計者不喜歡這種復制,他們很早就看到了如果表達式有副作用以及值,那么句法語句和表達式之間的區別并不是很有用,所以他們把它去掉了。Haskell、Icon、Lisp和ML都是沒有語法語句的語言-它們只有表達式。即使是類結構化循環和條件形式也被認為是表達式,它們有值-但不是很有趣的值。