2010-12-06 15 views
4

我目前正在學習c#並閱讀幾本書。我可以做很多事情,但只能從修改示例 - 它真的挫折,我實際上不知道如何/爲什麼一些更基本的項目工作。c#語法問題 - for循環和行尾

我剛剛完成了一個控制檯應用程序,它需要參數並逐個顯示它們。

的代碼是:

using System; 

class test 
{ static int Main(string[] argsin) 
{ 

for (
     int i = 0; 
     i < argsin.Length; 
     i++ 
    ) 
Console.WriteLine("Argument: {0}", argsin[i]); 
Console.ReadLine(); 
return -1; 
} 
} 

現在,這個完美的作品,但是從基本來了解Visual Basic中,如何/爲什麼它知道打印正確的參數,然後去(沒有雙關語!)在第一個Console.WriteLine之後沒有退出應用程序的情況下......我覺得我已經錯過了這個工程的基本原理!

接下來,爲什麼在for循環中,除i++之外,每行都以分號結尾?

我一直忘記不時地添加它,然後當試圖弄清楚爲什麼它不編譯時,我添加了一個我不想要的地方!

+0

@Bobby - 爲什麼要刪除語法標籤? – Wil 2010-12-06 12:58:09

+0

@Wil:因爲我認爲`[語法]`不是一個真正有用的標籤,但這是我的看法。我也回滾了我所做的更改,因爲我意識到修復格式會消除您的問題的全部含義。抱歉給你帶來不便。 – Bobby 2010-12-06 13:04:19

+1

這個問題現在完全有道理。我不知道語法已被編輯。雖然我看到我回答它的時間太晚了。 :-) – 2010-12-06 14:15:35

回答

3

按照慣例c#和所有類似的語言,當提供一個for循環(或if語句等)將立即運行後行。就我個人而言,我不喜歡這樣寫代碼,我覺得它缺乏可讀性。

爲了澄清,我們可以添加花括號來表示範圍

for (
     int i = 0; 
     i < argsin.Length; 
     i++ 
    ) 
{ 
    Console.WriteLine("Argument: {0}", argsin[i]); 
} 
Console.ReadLine(); 
return -1; 

現在什麼對循環執行的明確定義(如果我們想做更多的在我們的循環中,我們會在添加的額外的指令大括號)。

編輯: 定義for循環的分號的原因是該定義的每個部分都是一個單獨的語句。

int i = 0; //creates an integer i and sets its value to 0 
i < argsin.Length; sets our comparison operation to define when the loop ends 
i++ //what to do at the end in this case increment i by 1 

每個需要被視爲獨立於其他的和作爲半結腸表示在C#語句的結束(這就是爲什麼每行中它結束),我們用它來拆散,因此編譯器的發言可以閱讀它。

雖然2分號是強制性的,但如果我們想要改變它的話,我們不能這樣做。

int i = 0; 
for (;;) 
{ 
    if(i>=argsin.Length){ 
     break; 
    } 
    Console.WriteLine("Argument: {0}", argsin[i]); 
    i++; 
} 

這是功能上等同於你寫的方式,但我已經感動了所有的邏輯出了用於聲明其地位相當於內部(或外部定義我的情況下)的循環

7

你的代碼的格式稍有奇怪的是,如果你重新格式化爲這個我認爲這是比較容易理解:

using System; 

class test 
{ 
    static int Main(string[] argsin) 
    { 
     for (int i = 0; i < argsin.Length; i++) 
     { 
      Console.WriteLine("Argument: {0}", argsin[i]); 
     } 
     Console.ReadLine(); 
     return -1; 
    } 
} 

因此,大家可以看到int i = 0; i < argsin.Length; i++不是3條不同的線路,他們都只是參數for循環。

並且添加{}可以更容易地查看for循環內部的哪些代碼行。

1

我已經將你的格式化了一些,這會讓你更容易理解它的工作原理。

using System; 

class test 
{ 
    static int Main(string[] argsin) 
    { 

     for (int i = 0; i < argsin.Length; i++) 
      Console.WriteLine("Argument: {0}", argsin[i]); 

     Console.ReadLine(); 
     return -1; 
    } 
} 

有對C類語言一個特殊的規則:你定義它是一個使用if(true) { ... }類似If True Then ... End If範圍,但如果你只有一條線,你就可以決定使用括號。因此,iffor[each]之後的下一行將用於範圍。

i++不以;結尾,因爲它在for的聲明範圍內。

此外,不要忘了看看foreach循環。

1

如果我重寫與不同的格式(但相同的語法)的方法,它可能使事情更清晰:

static int Main(string[] argsin) 
{ 
    for (int i = 0; i < argsin.Length; i++) 
    { 
     Console.WriteLine("Argument: {0}", argsin[i]); 
    } 

    Console.ReadLine(); 
    return -1; 
} 

請記住,C#不使用語句終止換行符(不像VB)。你的'for'循環中的「第三行」實際上不是「行」,它只是第三個表達式,並由右括號終止。

循環繼續而不是退出的原因是因爲(沒有用於指示語句塊的波形括號)'for'循環只會在循環之後立即循環單個語句 - 即'Console.WriteLine'。我猜你認爲'ReadLine'和'return'語句是循環的一部分,但在C#語法中,情況並非如此。 (我在我的版本中添加了一些瑕疵,以使循環的範圍更加清晰)。

2

應用程序打印正確數量的參數的原因是WriteLine語句是循環的一部分。在C#中,如果在for語句後只有一行代碼,則不需要大括號。 (這是if也一樣)

所以

for (int i = 0; i < argsin.Length; i++) 
    Console.WriteLine("Argument: {0}", argsin[i]); 

相同

for (int i = 0; i < argsin.Length; i++) 
{ 
    Console.WriteLine("Argument: {0}", argsin[i]); 
} 

由於爲i++多數民衆贊成只是它是如何經過分號。正常情況下,for聲明是寫在一行上,就像我在上面的示例中所做的那樣。

希望這會有所幫助。

1

我來回答你的問題的一部分...

for是有初始值,循環語句和終止條件的構造。

所以

for (X, Y, Z) { } 

將相當於

X; 
while (Y) 
{ 
// code 
    Z; 
} 

至於你提到不能在quiting應用問題 - for()會結合第一NEXT語句或語句塊。就你而言,你只有一行作爲陳述。如果會有更多的線條,您應該將它們寫入{}

0

也就是說的for循環的基本,在該循環中,聲明整數的起始值i是零,並且它應當繼續循環,直到i等於串[argsin]的長度,並增加該值我每次迭代。這意味着,如果你的argsin數組的長度爲5,則循環

// first run 
for(int i = 0;i<5;i++) 
Console.WriteLine("Argument: {0}",argsin[0]); 

// second run 
for(int i = 1;i<5;i++) 
Console.WriteLine("Argument: {0}",argsin[1]); 

// third run 
for(int i = 2;i<5;i++) 
Console.WriteLine("Argument: {0}",argsin[2]); 

// forth run 
for(int i = 3;i<5;i++) 
Console.WriteLine("Argument: {0}",argsin[3]); 

// fifth run 
for(int i = 4;i<5;i++) 
Console.WriteLine("Argument: {0}",argsin[4]); 

運行後5,我將在5並不會滿足5 < 5並退出該循環,並與下一個語句下去。

1

for循環的典型語法是:

for(int i = 0; i < argsin.Length; i++) 
{ 
    //<CODE> 
} 

所以,你會讀它(在你的頭腦)爲:「隨着臨時值‘I’開始值爲0,而‘我’小於「argsin.Length」,做「// ' with i as the value, always ending with 'i++'"

A for loop just gets translated to:

{ 
    int i = 0; 
    while(i < argsin.Lenth) 
    { 
     //<CODE> 
     i++; 
    } 
} 

(The extra surrounding braces are to say that 'i' goes out of scope and can no longer be used when the brace closes). Like any 'if' or 'while' statement the closing parenthesis provides the 'end-of-statement' "Character" (if you will) and so the semicolon is unnecessary. Earlier they are a must because you have to know where to end each statement.

[EDIT]

By the way: there's a little more to it than a straight translation. There are cases where you can include multiple initializations, and multiple 'at the end of each loop' instructions. Don't worry about those until you understand what's going on.

4

I will try to explain the loop by comparing to VB syntax.

In C#: for (int i = 0; i < 5; i++)

在VB:For i = 0 To 4

i = 0部分是在兩個相同的,所以我想這是很明顯 - 這是用來初始化循環迭代。

在C#中的i < 5部分在VB中變成0 to 4 ....你可以認爲這就好像VB正在做一個「快捷方式」,但兩者的含義是相同的:那就是循環條件,即什麼是條件是循環將繼續運行,在這種情況下,循環將繼續只要i是小於5

最後,這是需要在C#中告訴「會發生什麼給迭代後i++部分運行每次迭代?「在舊的友好的VB中不需要,它會簡單地爲你增加1,總是 - 默認情況下。

爲什麼循環的各部分後有分號?由於每個部分都有其自己的含義和用法,所以編譯器在構建最終代碼時必須知道如何分離這些部分。爲什麼不在i++部分之後使用分號?在最後一個參數傳遞後沒有逗號的原因相同Console.WriteLine("Argument: {0}", argsin[i],);

關於沒有「阻塞」的循環只有一行,在其他答案中已經解釋過,經驗法則是C#允許單行塊出現而沒有括號。