簡體   English   中英

for循環范圍語法

[英]for loop range syntax

我花了幾個小時來調試一個我認為會出現語法錯誤的問題。

a = zeros(3);
for i=1:1size(a,2) % note the missing colon between 1 and size(a,2)
    i
end

以下僅顯示

ans = 3
1

從本質上講,似乎Matlab / Octave將上述內容解析為:

for i=1:1
    size(a,2)
    i
end

但請注意

i=1:1size(a,2)

產生語法錯誤。 有沒有一個很好的理由Matlab / Octave有這個for循環語法? 是否有一些它應該變得更容易? 只是好奇是否有人對此有任何想法。 謝謝。

Matlab的語法允許這一點確實有點令人驚訝。 我不知道為什么這是允許的。 一個原因可能是在一行上允許for循環:

>> for i=1:3 disp(i);end
     1
     2
     3

但有趣的是,不允許刪除空格:

>> for i=1:3disp(i);end
 for i=1:3disp(i);end
        |
Error: Unexpected MATLAB operator.

這個原因可能是d之后的數字是寫浮點數的另一種方式( 3d10 == 3e10 ),因此解析器/標記器最初認為你定義了一個數字,但是當它看到i時會感到困惑。 Daniel的fprintf示例確實有效,因為后跟f的數字不是有效數字,因此tokenizer會理解您啟動了一個新令牌。

我想多年前(> 30?),當他們定義matlab的語法時,他們沒有預見到這會引入這種難以發現的問題。 我猜matlab最初是由工程師為工程師編寫的,而不是由知道如何設計通用編程語言的人編寫的。 其他語言(如C或Python)使用標點符號將循環條件與循環體分開,因此沒有歧義。 我不知道是否仍然可以糾正Matlab的語法,因為它可能會破壞依賴於當前行為的舊代碼。

至少,如果您使用最新版本的Matlab,編輯器會警告您的代碼中存在各種問題 注意右邊框中的小紅色破折號可以為你節省幾個小時的調試時間(但也許你正在使用八度音階)。 我試圖養成一個習慣來修復它所表示的所有警告。 對於您的代碼,它顯示以下內容:

編輯截圖

你的代碼相當於

a = zeros(3);
for i=1:1
    size(a,2)
    i
end

有些地方每個人都會使用換行符或空格,但解析器本身並不需要。

最小循環:

for i=1:3fprintf('%d',i),end

但我建議至少使用一個逗號分隔版本,其他一切都很難讀:

for i=1:3,fprintf('%d',i),end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM