2010-08-14 6 views
6

저는 Python에서 SO 질문을 읽고 있었는데 for-loop에서 괄호가 부족하다는 것을 알았습니다. 나에게 좋았어, 그때 나는 이상하게 여겼다 : 왜 C#은 그들을 필요로 하는가? 내가 쓸 수없는 이유왜 C#은 조건문 주위에 괄호가 필요합니까?

if (thing == stuff) { 
} 

foreach (var beyonce in allthesingleladies) { 
} 

을 그래서 궁금 :

예를 들어, 나는 현재 쓸 필요

if thing == stuff { 
} 

가 구문이 있나요 내가 모르고있는 성명서의 모호성?

PS, 재미있게, 중괄호 한 - 라이너 (선택 사양)가 될 수 있습니다

if (thing == stuff) 
    dostuff(); 
+0

나는 obj-c와 php를 사용하기 때문에 때때로 사용하지 않아도됩니다. : p 그냥 내 2p. –

+0

@Ardman - OP는'{} '이 아닌'()'을 참조하고 있습니다.하지만 PS는 문제를 혼동합니다. – ChrisF

+0

@Ardman : 명확하게 말하면, 중괄호는'if' 다음에 * 이상의 문장을 * 포함하는 경우에만 필요합니다 (단일 문장은 여러 줄에 걸쳐있을 수 있습니다). –

답변

8

시스템은 조건이 중지되고 명령문이 시작될 때 알 수있는 방법이 필요합니다. 즉, 조건 주위의 괄호는 선택 사항이며, 또는은 명령문 주변의 중괄호가 선택 사항입니다. C#의 디자이너는 중괄호를 선택적으로 만들도록 선택했습니다 (단일 문이있는 경우).

이를 고려

if x == 12 - x == 3 ? x++ : x--; 

조건이 끝나고 문이 시작되지만 괄호를 필요로하는 것이 실질적으로 더 쉽게 위치를 알 수 기록 될 수 파서. 필자의 예에서 문법은 전체 문장이 if (x == 12) { -x == 3 ? x++ : x--; }임을 나타냅니다. 그러나 -이 두 번째 ==을 치기 전까지는 진술의 시작임을 알지 못합니다.이 토큰은 이미 3 토큰입니다.

이러한 예제를 올바르게 구문 분석하려면 입력 스트림에서 임의의 수의 토큰을 조사해야하므로 (사람이 읽을 수 있도록 코드를 작성하는 것이 틀림 없음) 괄호를 요구하는 좋은 이유가 있습니다.

+0

에서 나옵니다. 틀림없이 BNF에 따르면, "항상 * 다음에 * 하나의 문장이 있습니다. "절. 그 트릭은 복합 표현이 될 수 있으며, 몇 개의 명령문이 그 중괄호 사이에 포함되어 있습니다. –

+0

사실입니다. 그러나, 왜 * * *가 아닌 한, * 어느 것도 생략 할 수없는 이유에 대한 대답은 아직 없습니다. OP의 마지막 두 예제 모두 모호합니다. 왜 그 중 하나만 허용됩니까? (수사학적인 질문으로 더 많이 묻습니다 ...) –

+0

아, 좋은 지적입니다. 나는 중괄호가 재미있는 퀴즈 일 뿐이라고 생각했다. 그러나 네 말이 맞다. 선택 사항 인 괄호 *와 * 선택적 괄호를 사용할 수 없다. –

0

그것은 차례 차례 차례로에서 온 C에서 온 C++에서 온 자바에서 온 언어 설계 선택이다 ???

파이썬은 의도를 보여주는 들여 쓰기 도구가 필요하지 않습니다. F #도 똑같습니다. 그것은 좋은 생각입니다 (IMO).

+0

파이썬은 동봉 된 명령문의 시작을 나타내는 콜론이 필요합니다. F #은'do' 또는'then'을 사용합니다. – Gabe

+0

C는 [B] (http://en.wikipedia.org/wiki/B_%28programming_language%29) –

2

는 [내가 그녀를 이것에 대한 골조에 대한 가능성이있어 알고 있지만 내가 그것을 말할 수있어 모두 동일] 뼈에 날 귀찮게 한 가지 주로 비주얼 베이직 프로그래머로

. 내 의견으로는, 괄호는 선택 사항이고 중괄호는 필수 항목이어야합니다. 그것이 물어 보는 것이 너무 많은 경우 Microsoft는 vb의 C#에 해당하는 것을 도입하여 vb에서 C#으로 '차용'할 수 있습니다.

하지만 왜 그럴까요? Microsoft는 C, C++ 및 Java를 기반으로 C#을 설계했습니다. 모두 if 조건을 parens에 넣었으므로 C#이 다른 이유는 무엇입니까?


편집

솔직히 옵션 및 명명 된 매개 변수의 C# 4의 '도입, 항상 (적어도 VB6 이후) VB되었습니다 기능의 다음 릴리스를 기반으로 생각 C# (C# 5.0)은 '새로운'기능을 도입 할 수 있으므로 불필요한 괄호를 입력 할 필요가 없습니다.

if condition then something을 가진 세 번째 if condition ? truePart : falsePart이 있거나 vb와 비슷한 C#을 사용하지 않는 사람들에게는 if condition do something이 좋지 않을 것입니다.

+1

이전의 VB 프로그래머로서, 나는 또한 괄호 (그리고 중괄호)가 자극적 인 것을 발견했을 것이다. 그러나 개혁 된 C# 프로그래머로서 저는 중괄호와 괄호가 펜스 포스트 (괄호와 중괄호는 단어와 시각적으로 구별됩니다)로 시각적으로 동작하기 때문에 코드를 읽기 쉽게 만듭니다. 오늘 나는 VB를 읽는 것이 불편하다는 것을 알았지 만, 익숙한 것 (또는 현재 사용하고있는 것)으로 추측된다고 생각한다. –

+0

구두점을 사용하면 읽기가 쉽다는 것에 동의합니다. 단어 구두점을 사용하는 언어 (예 : COBOL 또는 VB)는 읽기가 더 어렵습니다. – Gabe

+3

VB에는 parens, Then 키워드가 있습니다. 키워드 대신 구두점을 사용하는 것은 단순히 스타일 선호입니다. –

4

이것은 'C'로 돌아가는 구문 'feature'이고, 그 전에는 어쩌면 어떤 언어에 대한 것입니다. C가, 생각보다 짧은 표기 적은 키워드가 유행했다 때

는 본질적으로 그것은 시간에

if (condition) statement; 

if condition then statement; 

사이의 선택이었다.

0

환자에게 내 druthers가 있다면, 나는 괄호 밖의 하나의 조작자를 허용 할 것입니다 : 느낌표. 복잡한 부정적인 조건에 대한 코드 테스트는 복잡한 긍정적 인 것에 대한 코드 테스트와 비교하여 여분의 괄호 세트로 끝납니다.

+0

필자가 동의한다면,'만약! '이 짧고 길다는 말은'하지 말 것'입니다. – Gabe

0

간단히 말해 C/C++/C#이 공백을 처리하는 방법 때문입니다. 명령문은 여러 줄에 걸쳐있을 수 있으므로 구분 기호가 필요합니다. 또한 문을 "차단"하거나 블록을 함께 그룹화하는 방법이 필요합니다.

  • C/C++/C#을 사용()의 {}의
  • VB/VB.NET/VBScript를/VBA 사용 기능/종료 기능, 하위/종료 서브, 만약/다음/Else/Else If/End If와 같이 을 켭니다. VB 기반 언어는 여러 행에 걸쳐있는 명령문을 지원하지 않기 때문에 차단에만 사용됩니다.

특정 질문이있는 경우 식을 만드는 데()을 사용하고 있습니다. 따라서 {} (블로킹 분리 문자)가 필요하지 않으므로 표현식을 사용하여 컴파일러에 알리는 방법이 필요합니다.