NUM和ARRAY都是雙精度變量,不知道if塊將如何執行。什麼時候會停止?它究竟在做什麼?如果我們到8,那麼我們是否退出do循環?Fortran 77 Do Loop塊說明
感謝
DO 7 I = 1,28
IF (NUM - ARRAY(I)) 8,7,7
7 CONTINUE
I=29
8 NUM = ARRAY(I)
....
....
....
....
NUM和ARRAY都是雙精度變量,不知道if塊將如何執行。什麼時候會停止?它究竟在做什麼?如果我們到8,那麼我們是否退出do循環?Fortran 77 Do Loop塊說明
感謝
DO 7 I = 1,28
IF (NUM - ARRAY(I)) 8,7,7
7 CONTINUE
I=29
8 NUM = ARRAY(I)
....
....
....
....
如前所述,循環中的條件是arithmetic if statement。
我們知道(而這明確在此以前的答案說明),如果num
小於array(i)
標籤8
選擇,否則標籤7
選擇。在另外一個答案中也指出,這些都有退出循環或循環的效果。準確地說,我會繼續。
DO結構有一個範圍。像問題中那樣的非塊DO構造具有包括do
語句和DO終止語句(在這種情況下爲7 continue
)之間的語句的範圍。 DO終止聲明是構造範圍內跳轉的有效目標。
當跳轉到DO終止語句時,執行仍在構造的範圍內。該終止語句被執行(在這種情況下,continue
,什麼都不做)並且循環迭代條件再次被測試。也就是說,循環循環。
在DO構造中,跳轉到構造範圍之外的語句會終止構造的執行:如出口。
這個例子,那麼,具有使用IF構造等價形式(與go to
秒 - 包涵)
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
GO TO 7
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)
現在,因爲標記7
的語句是一個continue
語句中,我們可以寫爲
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
CYCLE
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)
這仍然是非常醜陋的(而不僅僅是因爲所有的大寫)。幸運的是,我們可以做得更漂亮。 i=29
語句只有在循環終止時纔會執行,跳轉到標有8
的語句。現在,循環索引i
控制着I = 1,28
,所以當循環終止時,索引已經是has the value29
。這個任務什麼都不做(在現代的Fortran中),所以我們可以刪除它。這給我們留下了
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
CYCLE
END IF
7 CONTINUE
8 NUM = ARRAY(I)
當我們也注意到,IF結構後面緊跟循環的結束(和所以我們並不需要顯式循環),我們有
DO 7 I = 1,28
IF (NUM < ARRAY(I)) EXIT
7 CONTINUE
NUM = ARRAY(I)
或(更漂亮)
DO I = 1,28
IF (NUM < ARRAY(I)) EXIT
END DO
NUM = ARRAY(I)
所有這些例子做的是尋找在array(1:28)
比num
更大,或最早元素的值如果沒有。
這就是我無法編輯標籤的原因。我相信我投票結束時會有重複(有幾個),但是如果我失去了錘子特權,它將不會在審查隊列中獲得足夠的選票,而且選票將會消失。我們需要更多擁有金色標籤徽章的人。 –
對於重複的目標,你有一個好的建議嗎?我沒有看到一個(顯然),但我仍然對這個問題有近距離投票。 – francescalus
這一個https://stackoverflow.com/questions/11124855/fortran-if-statement-with-numbers-labels-rather-than-another-statement已經是其他兩個目標。我現在也有投票權,他們在無效時得到退款。 –
這就是所謂的算術,如果:if(a) 1,2,3
。它的意思是:如果a<0
它變爲1,如果(a==0)
它去2,並且如果它(a>0)
如果(NUM-陣列(ⅰ)< 0)它進入8變爲3.
在代碼(退出循環並跳過另一行),否則它將轉到7(循環)。
謝謝你的回答。 – LionsFan
這看起來像現代語言,例如C? – LionsFan
DO循環來自1-3行。當你在第四行時,你離開DO循環。 – gbdcool
如果我從第2行到第4行怎麼辦?當條件滿足時?那麼我走出了循環?稱這是'休息'聲明是否安全? – LionsFan