[c#] C #에서 선행 문없이 {} 코드 블록을 허용하는 이유는 무엇입니까?

왜 C #을 허용 않는 앞의 문이없는 코드 블록 (예를 들어 if, else, for, while)?

void Main()
{
    {   // any sense in this?
        Console.Write("foo");
    }
}



답변

당신이주는 맥락에서는 의미가 없습니다. 콘솔에 상수 문자열을 쓰는 것은 프로그램 흐름의 어느 곳에서나 동일한 방식으로 작동합니다. 1

대신, 일반적으로 일부 지역 변수의 범위를 제한하는 데 사용합니다. 이것은 여기여기에서 더 자세히 설명 됩니다 . 간단한 예 는 João Angelo의 답변Chris Wallis의 답변 을 참조하십시오. C 스타일 구문을 사용하는 다른 언어에도 똑같이 적용되지만이 질문과 관련이 있다는 것은 아닙니다.


1 물론, 전혀 예상치 못한 Console일을하는 Write()방법을 사용하여 재미 있고 자신 만의 수업을 만들기로 결정하지 않는 한 .


답변

{ ... }로컬 변수에 대한 새로운 범위의 도입 적어도 부작용을 갖는다.

나는 switch각 사례에 대해 다른 범위를 제공하기 위해 문 에서 사용하는 경향이 있으며, 이런 식으로 사용의 가능한 가장 가까운 위치에서 동일한 이름으로 지역 변수를 정의하고 사례 수준에서만 유효 함을 나타낼 수 있습니다.


답변

범위정의 하기 위해 중괄호를 사용하는 많은 C 구문 언어의 논리적 부작용 이라기보다는 C # 의 기능 이 아닙니다 .

귀하의 예에서 중괄호는 전혀 효과가 없지만 다음 코드에서는 변수의 범위와 가시성을 정의합니다.

이것은 i가 첫 번째 블록에서 범위를 벗어나고 다음 블록에서 다시 정의되기 때문에 허용 됩니다.

{
    {
        int i = 0;
    }

    {
        int i = 0;
    }
}

이 작업은 허용되지 않습니다 내가 범위 밖으로 떨어 더 이상 외부 범위에서 볼 수없는 것처럼 :

{
    {
        int i = 0;
    }

    i = 1;
}

기타 등등.


답변

{}여러 문장을 포함 할 수있는 문장으로 생각 합니다.

하나의 문이 뒤에 오는 부울 식으로 존재하는 if 문을 고려하십시오 . 이것은 작동합니다.

if (true) Console.Write("FooBar");

이것은 잘 작동합니다.

if (true)
{
  Console.Write("Foo");
  Console.Write("Bar");
}

내가 착각하지 않았다면 이것을 블록 문이라고합니다.

이후 {}다른 문을 포함 할 수 있습니다 또한 다른 포함 할 수 있습니다 {}. 변수의 범위는 부모 {}(블록 문)에 의해 정의됩니다 .

내가 말하려는 요점은 그것은 {}단지 진술 일 뿐이므로 if 또는 무엇이든 필요하지 않습니다.


답변

C- 구문 언어의 일반적인 규칙은 “그 사이의 모든 { }것은 단일 문으로 취급되어야하며 단일 문이 할 수있는 곳이면 어디든 갈 수 있습니다”입니다.

  • 애프터 if.
  • for, while또는 do.
  • 코드의 모든 곳 .

모든 의도와 목적을 위해 언어 문법에 다음이 포함되었습니다.

     <statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>

즉, “문은 (다양한 것) 또는 여는 중괄호 로 구성 될 수 있으며 , 그 뒤에 문 목록 (하나 이상의 문을 포함 할 수 있음)이 뒤 따르고 닫힌 중괄호가 뒤 따릅니다.” IE ” { }블록은 모든 문을 어디에서나 대체 할 수 있습니다”. 코드 중간에 포함됩니다.

{ }단일 문이 갈 수있는 곳에 블록을 허용하지 않는 것은 실제로 언어 정의를 더 복잡 하게 만들었습니다 .


답변

C ++ (및 Java)는 선행 문없이 코드 블록을 허용했기 때문입니다.

C가 허용했기 때문에 C ++에서 허용했습니다.

모든 것은 유럽 프로그램 언어 ( Modula-2 기반) 디자인이 아니라 미국 프로그램 언어 (C 기반) 디자인이 이겼다는 사실 때문이라고 말할 수 있습니다 .

(제어문은 단일 명령문에서 작동하며 명령문은 그룹이되어 새 명령문을 작성할 수 있습니다.)


답변

// if (a == b)
// if (a != b)
{
    // do something
}