IMO는 주로 C ++에 이미 존재했기 때문에 Java 및 C #에 포함되어 있습니다. 그렇다면 실제 질문은 왜 C ++이 그런 식입니까? C ++의 디자인과 진화 (§16.3) 에 따르면 :
try
키워드는 완전히 중복 그래서있는 { }
여러 문이 실제로 시도 블록 또는 처리기에 사용되는 경우를 제외하고 브래킷. 예를 들어, 다음을 허용하는 것이 쉽지 않을 것입니다.
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
그러나 혼란스러운 사용자로부터 지원 인력을 구하기 위해 중복성이 도입되었다는 것을 설명하기가 어렵습니다.
편집 : 이것이 왜 혼란 스럽습니까, 나는 문제가 있음을 깨닫기 위해 @Tom Jeffery의 대답 (특히 수신 된 투표 수)에서 잘못된 주장을보아야한다고 생각합니다. 파서에서 이것은 else
s를 s와 일치시키는 것과 다르지 않습니다. if
다른 그룹을 강제로 묶는 중괄호가 없으면 모든 catch
절이 가장 최근의 것과 일치합니다 throw
. 잘못 포함 된 languags에 대해서도 finally
조항이 동일하게 적용됩니다. 파서의 관점에서 볼 때 이것은 현재 상황과 크게 다르지 않습니다. 특히 문법이 지금 서 있기 때문에 catch
절을 함께 그룹화 할 것은 없습니다 . 괄호는catch
catch 절 자체가 아닌 절.
파서를 작성하는 관점에서 볼 때 차이가 거의 없습니다. 다음과 같이 시작하면
simple_statement: /* won't try to cover all of this */
;
statement: compound_statement
| simple_statement
;
statements:
| statements statement
;
compound_statement: '{' statements '}'
catch_arg: '(' argument ')'
그렇다면 차이점은 다음과 같습니다.
try_clause: 'try' statement
과:
try_clause: 'try' compound_statement
마찬가지로 catch 절의 경우 :
catch_clause: 'catch' catch_arg statement
vs.
catch_clause: 'catch' catch_arg compound_statement
완전한 try / catch 블록의 정의는 전혀 변경할 필요가 없습니다. 어느 쪽이든 그것은 다음과 같습니다.
catch_clauses:
| catch_clauses catch_clause
;
try_block: try_clause catch_clauses [finally_clause]
;
[여기서는 [whatever]
선택 사항을 나타내는 데 사용 하고 finally_clause
있으며 질문과 관련이 있다고 생각하지 않기 때문에 구문을 생략합니다 .]
당신은 따라하지 않는 경우에도 모든 Yacc에-처럼이 문법 정의 점은 매우 쉽게 요약 될 수있다 : 마지막 문 (로 시작하는 것이이 try_block
) 하나입니다 catch
절이와 일치 얻을 try
조항 - 그것은 남아 정확히 중괄호가 필요한지 여부에 관계없이 동일합니다.
/ 요약한다 반복하려면 다음과 같이 괄호 그룹 제어 명령문 에 의해catch
의,하지만 할 수 없는 그룹이 catch
자신이야. 따라서, 그 괄호는 전혀 없습니다 더 있는 결정에 따라 효과가 catch
있는 이동을 try
. 파서 / 컴파일러의 경우 작업은 어느 쪽이든 똑같이 쉽다 (또는 어렵다). 그럼에도 불구하고 @Tom의 답변 (및 수신 된 투표 수)은 그러한 변경 이 사용자를 혼란스럽게 할 것이라는 사실을 충분히 보여줍니다 .
for
부분이 뭔가를 지정해야합니다initial
,condition
그리고step
같은initial
필요 변수를 정의하지 및step
증분 할 필요는 없다.