您好,登錄后才能下訂單哦!
本篇內容介紹了“如何使用編程中花括號”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
首先,以非塊狀語言為例
所有熟悉C風格編程語法的程序員都熟悉編程塊,用C、C ++、Java、JavaScript和其他語言編寫的所有主要編程結構都是塊結構的。換句話說,這些構造的主體放置在塊中,這些塊由打開和閉合的花括號分隔。
有人可能會說,這并不是完全正確的,因為 if 語句和循環(這里只提到兩種編程構造),如果它們的主體只有一個語句,就可以不用塊來構造。然而,在過去的幾年里,編程風格專家建議將所有的構造體放在一個塊中(參見Douglas Cockroft的“JavaScript: The Good Parts”中關于將所有if和循環體放在塊中的論點特別有說服力)
然而,第一批高級編程語言并沒有塊。
我將使用大約在20世紀50年代末的FORTRAN語言來演示這一點。
Donald Knuth在他關于早期高級編程語言的優秀評論文章《編程語言的早期開發》中比較了幾種早期編程語言的特性,這篇文章轉載在他的書《計算機語言選集》中。他的做法是,演示某個計算機程序如何用不同的語言實現。這個程序實現了一個叫做TPK算法的算法,在現代JavaScript中是這樣的:
function f(t) { return Math.sqrt(Math.abs(t) + 5 * Math.pow(t, 3)); } let arr = []; let y; for (let i = 0; i < 11; i++) { putstr("Enter a number: "); arr[i] = parseFloat(readline()); } for (let i = 10; i >= 0; i--) { y = f(arr[i]) if (y > 400) { print(y,"is too large."); } else { print(i,y) } }
不要擔心程序做什么。重要的一點是,這個程序執行了Knuth認為在現代編程語言中對測試很重要的所有特性。
正如我提到的,Knuth將幾種編程語言與該算法進行了比較。他最后看過的一種語言,現在通常被認為是第一種真正的高級編程語言。下面是Knuth編寫的TPK程序在Fortran中的樣子:
C THE TPK ALGORITHM, FORTRAN STYLE FUNF(T) = SQRTF(ABSF(T))+5.0*T**3 DIMENSION A(11) 1 FORMAT(6F12.4) READ 1, A DO 10 J = 1, 11 I = 11 – J Y = FUNF(A(I+1)) IF (400.0-Y) 4, 8, 8 4 PRINT 5, I 5 FORMAT(I10, 10H TOO LARGE) GO TO 10 8 PRINT 9, I, Y 9 FORMAT(I10, F12.7) 10 CONTINUE STOP 52525
Fortran語法的細節我就不多說了,但你可以清楚地看到,該語言不包含塊。函數定義在一行上,而不是作為代碼塊,DO 循環使用一個行標簽來控制循環。當時的高級語言還沒有將復合語句分組成塊的概念,這些語言仍然依靠 goto 來控制程序流。
該代碼由Knuth使用1957年的Fortran版本編寫。1957年至1960年間,一種新的語言ALGOL被開發出來,它彌補了當時Fortran等語言和其他高級語言的許多缺陷。
Algol中的塊
Algol編程語言首次被描述是在1958年,盡管該語言最流行的版本是Algol 60。Algol的功能之一是將語句分組為復合語句(稱為塊)的能力,每個Algol程序都被視為一個塊,因為一個程序通常包含一個或多個語句(因此為復合語句)。Algol的開發者認識到,許多編程場景,如條件和循環,需要將語句作為一個單元來考慮。
Algol使用關鍵字 begin 和 end 標記了塊的開始和結束。一個區塊可以嵌套在另一個區塊里面,外區塊被認為是主導區塊,內區塊被認為是從屬區塊。例如,這里有一個Algol程序,可以嵌套塊:
begin real a; a := 1; begin real a; a := 2; print(a) end; print(a) end
依次打印數字2和1。
這是在Algol的 if 語句中如何使用塊的示例:
if x > -1 then begin if x ≠ 0 then x := 1/x end;
這是Algol中 for 循環塊的示例:
begin real a0, a1, a2, a3, z, p; integer n, i; read(a0, a1, a2, a3); read(n) for i := 1 step 1 until n do begin read(z); p := ((a3 × z + a2) × z + a1) × z + a0 print(p) end i end
現在讓我們看看Algol中的TPK程序,看看與Fortran版本相比,塊結構對該程序有什么幫助:
TPK begin integer i, real y; real a[0:10]; real procedure f(t); real t; value t; f := sqrt(abs(t)) + 5 × t ↑ 3; for i := 0 step 1 until 10 do read(a[i]); for i := 10 step -1 until 0 do begin y := f(a[i]); if y > 400 then write(I, 'TOO LARGE') else write(i, y); end end TPK
你應該能看出來,Algol版本的區塊結構讓它更像你我今天習慣閱讀的代碼。
轉到BCPL
塊結構語言的語法的下一個變化是1967年由劍橋大學的馬丁·理查茲(Martin Richards)開發的BCPL語言。在1960年至1967年Algol最初開發期間,編譯器和系統開發人員一直在尋找使用機器語言和匯編語言以外的語言開發系統應用程序(如操作系統)的方法。我之所以強調BCPL,是因為C是通過Ken Thompson開發的一種名為B的中間語言,作為BCPL的完善和改進而開發的。
Richards將BCPL開發為一種系統開發語言,它與匯編語言一樣高效,但具有更高級別的語法,從而使編碼更簡單、更高效。這意味著高級語言(如Algol)的許多特性需要以更有效的方式包含在BCPL等語言中。
實現這一效率的方法之一是將一個代碼塊的指定從單詞(begin 和 end)簡化為符號。對于復合語句和代碼塊,Richards選擇了符號 $( 代表開頭和 )$ 代表結尾,這些符號稱為節括號。
在BCPL中,如果 $( 和 )$ 與一個結構體一起使用,比如 if 語句或循環,那么它們就是在限定一個復合語句,如果 $( 包括一些聲明,那么它們就是在給一個塊劃定界限。
例如,下面是BCPL中帶有復合語句的 if 語句的寫法:
IF A < B $( LET T = A A := B; B := T $)
這是BCPL塊的示例:
GET "LIBHDR" LET START() BE $( LET A, B, C, SUM = 1, 2, 3, 0 SUM := A + B + C WRITES("Sum is ") WRITEN(SUM) $)
在這里,開始部分方括號是開始一個塊,因為聲明緊跟著方括號。
(和) 在C中成為 { 和 }
大約在1968年或1969年,貝爾實驗室的肯-湯普森和丹尼斯-里奇開始嘗試使用系統編程語言開發操作系統。湯普森其實一開始就嘗試使用Fortran進行探索,但當他意識到這不可能時,很快就放棄了。他決定要對BCPL進行修改,使其成為一種更符合自己喜好的系統編程語言,于是開發了B。
B雖然更接近湯普森和里奇想要的系統開發語言,但仍然不能完全滿足他們的需求,所以里奇開始為新的B開發另一種語言NB。NB的生命力并不長,最終被一種全新的語言所取代,他們自然而然地稱之為C。如果你對C語言是如何從BCPL、B和NB發展而來的感興趣,我鼓勵你閱讀丹尼斯-里奇的《C語言的歷史》。
湯普森在B中固定并延續到NB然后在C中固定的許多事物之一就是縮寫運算符,這些都是為了讓擴展后的語言適應當時計算機的內存限制所必需的。例如,湯普森創造了復合賦值運算符( += 為例)以及增量(++)和減量(-)運算符,作為提高語言效率的方法。此舉是為了提高效率,導致BCPL的其他運算符被簡化——例如,$( 和 $) 被 { 和 } 取代。
“如何使用編程中花括號”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。