2014-08-29 30 views
3

這是一個稍微修改的答案,我遇到了我在此問的一個前一個問題。當有些奇怪的事情發生時,我正在改變它來更好地理解它。爲什麼添加大括號到最裏面的循環給出這樣奇怪的結果?

在C#中的循環都應該以這種方式工作:

for (initial increment value, end increment value, increment rate) 
{ 
    // for loop body 
} 

答案代碼我似乎工作,但不具有圍繞最內層的環括號。下面的代碼:

using System; 

class Prime_Screening 
{ 
    static void Main() 
    { 
     Console.WriteLine("Prime numbers x, where: 0 < x < 100"); 
     bool prime; 

     for (int num = 2; num <= 100; num++) 
     { 
      prime = true;/


      for (int div = 2; div <= Math.Sqrt(num); div++) 
      // Why isn't the contents of this for loop in braces? Attempting it produces a weird output 
       if(num % div == 0) 
        prime = false; 
       if (prime) 
        Console.Write(num.ToString() + ", "); 
     } 
    } 
} 

我加括號到for循環,這樣我可以保持代碼的清晰,但我得到了一些奇怪的重複輸出:

5,7,9,11,11,13 ,13,15,17,17,17,19,19,19,21,23,23,23,25,25,25,27,29,29,29,29,31 ... 93,95,95 ,95,97,97,97,97,97,97,97,97,99,

爲什麼?雖然我們正在討論這個問題,但是如果陳述也是大括號的呢?

編輯:拼寫/語法

+0

爲您的代碼執行自動格式化。這將糾正縮進,原因將立即變得清晰。 – ths 2014-08-29 20:43:49

+0

在Visual Studio中,在該文件中的某處鍵入Ctrl + K,Ctrl + D。 – 2014-08-29 20:49:24

+0

我在Notepad ++中這樣做,所以這可能是爲什麼格式不清晰。 – 2014-08-29 21:02:09

回答

4

你並不需要使用大括號,但那麼只有第一條語句屬於循環。

因爲這裏不僅是一個if-else而是兩個if S中的第一個屬於循環:

for (int div = 2; div <= Math.Sqrt(num); div++) 
    if (num % div == 0) 
     prime = false; 
    if (prime) 
     Console.Write(num.ToString() + ", "); 

是一樣的:

for (int div = 2; div <= Math.Sqrt(num); div++) 
{ 
    if (num % div == 0) 
     prime = false; 
} 
if (prime) 
    Console.Write(num.ToString() + ", "); 

,而不是這個代碼,其中同屬到迴路:

for (int div = 2; div <= Math.Sqrt(num); div++) 
{ 
    if (num % div == 0) 
     prime = false; 
    if (prime) 
     Console.Write(num.ToString() + ", "); 
} 

來自msdn:for-loop

循環的主體由一個聲明,一個空的聲明,或聲明的 塊,可以通過內附在大括號零個或多個 語句創建其中。

+3

謝謝,這個問題引發了我一個循環! ;) – 2014-08-29 20:55:27

3

你會有奇怪的結果的原因是因爲不加撐聲明僅適用於下一條語句

這就是被沒有括號編譯:

for (int div = 2; div <= Math.Sqrt(num); div++) 
{ 
    // Why isn't the contents of this for loop in braces? Attempting it produces a weird output 
    if(num % div == 0) 
     prime = false; 
} 

if (prime) 
    Console.Write(num.ToString() + ", "); 
+5

*聲明*,而不是*行*,是迂腐。這與此處有關,因爲以下語句跨越多行。 – Servy 2014-08-29 20:39:50

3

for循環不需要跟一個語句塊(包裹在大括號語句的一些數字),它只是需要遵循由一個單一的聲明。語句塊只是將一些語句轉換爲單個(複雜)語句的一種方式。

跟隨你的內心for循環中的語句是:

if(num % div == 0) 
    prime = false; 

如果包裹在大括號它不會改變的代碼。如果你用花括號和下面的語句(第二個if塊)括起來(因爲你的縮進似乎表明),那麼你將改變代碼的語義。

此相同的行爲適用於ifwhileforeachdo等結構,以及,雖然interestingly enough not try/catch/finally blocks

+0

+1提到這同樣適用於其他結構以及'try-catch'-exception。有趣的環節,學會了懸而未決的問題;) – 2014-08-29 21:18:23

+0

同意。 C#在這裏是不一致的,我希望我記得這一點。 – 2014-08-29 21:55:07

0

當我們有多個語句放入代碼塊時,我們使用大括號。它可以用於for loopwhile loopif else

但是,我們不使用大括號時,我們只有一個語句。當我們不使用大括號時,下一個語句被認爲是在循環中。

在您的情況下,您必須將兩個if條件置於大括號中,否則將只考慮循環內部的第一個if條件。

+0

第二個'if' *不應該放在'for'循環中。他把它放在那裏,這就是破壞他的代碼。 – Servy 2014-08-29 20:44:29

+0

我確實在兩個if語句中都使用了大括號,而不僅僅是第一個。這是導致給定結果的原因。 – 2014-08-29 20:44:48

+0

@Code_Steel你必須在內部循環的大括號中只有第一個語句才能得到正確的結果 – Shaharyar 2014-08-29 20:48:52