C C 為什麼要開發do while, while, for這三種功能相同的迴圈結構?

時間 2021-05-12 17:31:50

1樓:82111668-2012

題主有興趣可以了解一下圖靈機,圖靈完備的定義,但是我這裡不詳細介紹了。

簡單地說,圖靈機就是一條寫著一串數字的紙帶,機器有乙個狀態,還有乙個只能讀寫紙帶當前位置的針頭,還可以左右移動一格紙帶。圖靈機能做的只有根據當前狀態和當前讀入的數字,同時修改自身狀態、數字並移動紙帶。

目前所有的程式語言,都能實現圖靈機能做的,同時所有程式語言能做的,都能被圖靈機實現。所以原則上,一門程式語言能支援順序結構、分支結構、迴圈結構就可以了,剩下的都是語法糖,不必要的。

同理,c++裡面的模板、類、函式,都是語法糖,可以避開的。當然為了程式設計的方便以及可讀性,你一樣會使用的。

此外吐槽一句,這個世界上還有一種東西叫lambda演算,和圖靈機等價的,如lisp語言。我這個學期學《程式設計思想與方法》,講的就是lisp方言scheme。在這種語言中,沒有迴圈,只能用函式遞迴模擬迴圈,你不放嘗試一下,毒性巨大。

此外一題,這門課大作業用這個語言實現簡單的神經網路,沒有封裝,沒有指標,沒有如c++一樣的陣列、stl,甚至沒有for、while,一切都是函式,您可以試試,反正我是寫的欲仙欲死

2樓:哲也

ruby裡有

while

do while

until

for in

loop

除此以外還有方法

each

times

upto

each_with_index

哪個看著舒服用哪個

3樓:蔣寅

三種都是非常好的迴圈。

三種迴圈有各自的使用場景,雖然可以互相轉換但亂用會很摳腳,使用得當的話光看下使用的是哪種迴圈就大概能判斷迴圈做什麼邊界條件是什麼。

熟練了以後不同的迴圈語句有不同的邊界慣性很容易讀。

do while(0)有一些使用技巧提高可讀性,估計不是設計初衷但很有用。

4樓:

功能可以相互替換但是讀起來感覺不一樣啊。

在合適的地方使用合適的語義對於後來者來說感官是不一樣的。

for (;;) 多數情況下可以認為迴圈變數不在迴圈體內修改,讀起來就是i從x變到y步長為z,執行以下迴圈。

while () 讀起來就是當x為真時執行以下迴圈do while 執行迴圈體,若x為假則退出程式的可讀性在這裡比功能性重要很多。

5樓:wzsayiie

3種迴圈結構的出現是歷史演化的產物。但C語言設計上用到這3種迴圈並不是什麼歷史慣性,主要還是「好用」,多種選擇。

C/C++的迴圈結構可以追溯到上世紀50年代的Fortran (FORmula TRANslation) ,同時期的還有 Lisp 、COBOL 等。當時並沒有如今意義的 while 語句,對於迴圈的表達大多需要使用 goto/if 的搭配來實現。

例如輸出 1 到 10 ,當時的 Fortran 程式看上去大約是這樣的:

i := 1

1 BEGIN

if i <= 10 then

goto 2

else

goto 3

end if

2 WRITE

write(i)

i := i + 1

goto 1

3 END

但是,for 語句已經出現了!即是說3種迴圈結構中for結構出現最早。當時是為了方便迴圈計數。Fortran 下大約是這樣:

do i := 1, 1, 10

write(i)

end do

第一句 「do i :=」 後面的3個值分別是初始值、步長、終止值。當時 Fortran 使用的關鍵字是 「do」 ,而不是 「for」 。

之後在 ALGOL 58/60 ,出於可讀性的考慮對 for 語法作了調整:

for i := 1 step 1 until 10 do

write(i)

end注意:這時的 for 語句的迴圈與退出取決於某個計數變數的增減,無法代替當時慣用的 goto/if 迴圈,以及後世的 while 、do/while 。

我們說回上世紀50年代。在 Fortran 等之後出現了 ALGOL (ALGOrithmic Language)系列語言,最終由量變積累引發質變的標誌性語言是 1958 年出現的 ALGOL 58 和 1960 年出現的 ALGOL 60 。兩者強化了在 ALGOL 系列中逐步出現的區塊巢狀、作用域、子過程等概念,並對語法進行了定型。

除了上面提到的 ALGOL 58/60 對 for 語句的調整,while 、do/while 語句也是在 ALGOL 58/60 上誕生的。只是當時 do/while 句式的關鍵字並不是 「do」 和 「while」 ,而是 「repeat」 和 「until」 。兩者在功能上的區別是 while 為「先驗」 (pre-test) ,即先判斷當前條件從而決定迴圈是否執行; do/while 是「後驗」 (post-test) ,先執行迴圈,再由執行結果決定迴圈是否要繼續。

2023年出現了由 Christopher Strachey 主導,劍橋大學與倫敦大學資助的 CPL (Combined Programming Language)語言專案,作為 ALGOL 60 的進一步改進。但由於語法特性太複雜而並沒有最終完成。在 CPL 上出現了用作中止迴圈的 break 語句。

2023年劍橋大學的 Martin Richards 發起了 BCPL (Basic Combined Programming Language)專案,摘取了 CPL 的一些語法作為子集。continue 語句是在 BCPL 上誕生的。之後貝爾實驗室的 Ken Thompson 現實了 PDP-7 上的編譯器版本,也就是被後世稱為「B語言」的C語言前身。

此時 for 、while 、do/while 已經有了大致的形狀,BCPL 上它們長這樣:

for i = 1 to 10 do

while i <= 10 do

repeat until i > 10;

直到此時 for 語句仍舊是只能依靠計數變數來控制迴圈。無法與 while 和 do/while (repeat/until)互換。

另外:BCPL 首次使用花括號來描述區塊的始末,這與當時主流硬體的改進與普及有關係。此前的鍵盤(電傳打字機的鍵盤)千奇百怪,很多鍵盤並沒有花括號、方括號的按鍵,因此許多程式語言傾向於使用 begin/end 來標記區塊始末。

2023年貝爾實驗室的 Dennis Ritchie 和 Ken Thompson 開始了C語言專案。直接起因是 PDP 系列機上的程式移植問題。不同的PDP機器的字長是不一樣的,此外 PDP-11 還提供了浮點數運算的功能;但 BCPL 只有機器字這一種型別。

C語言對 for 語句進行了改進,去掉了需要依靠計數變數控制迴圈的限制,變為如今廣為人知的形式:

for (xx; xx; xx)以上。

6樓:葉夢佳

while應該是最原始最簡單的

for迴圈的可讀性最好:

for(i=0;i<100;i++)

把迴圈控制變數的初值條件變化寫在同一行

do f while g比 f while(g)f的可讀性好

尤其是f非常複雜不方便和迴圈體比較的時候

7樓:望山

do while和while功能並不相同,前者迴圈體至少執行一次,後者有可能一次也不執行。for是while的語法糖,就是圖個方便,功能上完全可以用while代替。在合適的場合,for不但更簡潔也更容易理解。

do while比while好在那裡?為什麼要專門設計個do while?

pCBjR6 彙編會把while轉換為dowhile。如果硬要用彙編寫while的形式 cmp條件判斷在前 dowhile比while效能更好。 萌新阿岩 do while 語句與 while for 語句乙個最大的區別便是,do while 語句會先執行一次迴圈體。利用這個特點,可以在某些方面發揮...

很多後台開發為什麼要熟悉python和shell?

中大黑熊 因為伺服器啊,掛載服務的機器都是linux系統啊,都沒有圖形介面啊,然後又經常要做一些批量的處理啊,拉資料,拆分資料,寫常駐程序神馬的,你不熟悉shell或者python就只能呵呵了。就像我被各種鄙視啊哈哈哈哈哈 乙個最簡單的例子。windows 目錄分隔符是 linux 目錄分隔符是 現...

iOS 開發為什麼要設計乙個 CGFloat 的資料型別?

Ying Zhong 在你機器上試試這個 NSLog s encode CGFloat NSLog s encode double NSLog s encode float 或者你可以去看看 CGFloat 的定義 if defined LP64 LP64 define CGFLOAT TYPE d...