2014-08-29 3 views
3

이것은 약간의 수정 된 답변입니다. 나는 이전 질문에 대해 물었습니다. 이상한 일이 일어 났을 때 그것을 더 잘 이해하기 위해 그것을 바꿀 것입니다. C#에서 루프를 들어내부 for 루프에 중괄호를 추가하는 것이 이상한 결과를주는 이유는 무엇입니까?

이 방식으로 작동 해야하는 : 내가 가진

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

대답 코드가 작동하는 것 같다하지만 루프의 가장 안쪽 주위에 괄호가 없습니다.

5, 7, 9 11, 11, 13 : 나는 명확한 코드를 유지할 수 있지만, 좀 이상한 반복 출력을 가지고 있도록

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 루프에 괄호를 추가 : 여기 코드는 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

+0

Visual Studio에서 해당 파일의 어딘가에 Ctrl + K, Ctrl + D를 입력하십시오. –

+0

메모장에서이 작업을했습니다. ++이 때문에 서식이 분명하지 않습니다. –

답변

4

있지만 if, while, foreach, do 등 구조뿐만 아니라,에.모두 속하는 코드 반대로

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() + ", "); 

여기 이후

첫 루프에 속하는 단지 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() + ", "); 
} 

msdn :,210

루프의 본문은 중괄호에 0 개 이상의 문을 둘러싸하여 만든 문, 하늘의 문, 또는 문장의 블록으로 구성되어 있습니다.

+3

고마워,이 문제가 나를 위해 루프를 던져 버렸어! ;) –

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

* 문장 *, * line *이 아닙니다. 다음 문은 여러 줄에 걸쳐 있기 때문에 여기에 해당됩니다. – Servy

3

for 루프가 문 블록 다음에 할 필요가 없습니다 (중괄호에 싸여 문장의 일부 수), 단순히 따라야 할 필요가있다 :

없이 중괄호로 컴파일됩니다 것입니다 하나의 성명서로 명령문 블록은 단순히 몇 개의 명령문을 단일 (복잡한) 명령문으로 변환하는 방법입니다. 당신의 내면 for 루프를 다음과

문은 다음과 같습니다

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

중괄호에 코드를 변경하지 않을 것이라고 포장합니다. 만약 당신이 그것을 감싸고 다음 문장 (두 번째 if 블록)을 중괄호에 넣으면 (들여 쓰기가 나타납니다) 코드의 의미가 변경 될 것입니다.

이 같은 동작이 적용 당신은 괄호를 사용할 필요가 없습니다,하지만 첫 번째 문은 루프에 속하는 interestingly enough not try/catch/finally blocks

+0

+1 다른 구조와 try-catch 예외에 대해서도 똑같이 적용됩니다. 흥미로운 링크, 매달려 다른 문제를 배웠다;) –

+0

동의. C#이 여기에 모순되는데, 나는 이것을 기억하기를 바랍니다. –

0

코드 블록에 넣을 문장이 여러 개인 경우에는 중괄호를 사용합니다. for loopwhile loopif else

그러나 단 하나의 문장이있을 때는 중괄호를 사용하지 않습니다. 바로 다음 문장은 중괄호를 사용하지 않을 때 루프로 간주됩니다.

상황에 따라서는 if 조건을 중괄호에 넣어야합니다. 그렇지 않으면 루프 내에서 처음으로 if 조건 만 고려됩니다.

+0

두 번째'if' *는'for' 루프 안에 있으면 안됩니다. 그는 그것을 그 안에 넣었고 그것은 그의 코드를 어긴 것입니다. – Servy

+0

첫 번째 문장뿐만 아니라 두 if 문 양쪽에 중괄호를 붙였습니다. 이것이 주어진 결과를 이끌어 낸 것입니다. –

+0

@Code_Steel 올바른 결과를 얻으려면 내부 루프의 중괄호 안에 첫 번째 문장 만 넣어야합니다. – Shaharyar

관련 문제