[英]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.