왜 코드 한 줄만 반복할 때에도 블록으로 감싸줘야 해요?
조회수 2699회
제가 C++강의를 듣고 있는데 거기 교재에서
- 들여쓰기 잘 할 것
- 연산자 우선순위를 믿지 말고 괄호를 써서 연산 순서를 표시할 것
- 한 줄을 쓰더라도 { } 블록을 쓸 것 -> 왜죠????????
- 비교를 할 때는 const 객체를 왼쪽에 쓸 것
- 0 이상의 숫자에서는
unsigned
를 쓸 것 - delete 한 포인터는 NULL로 설정해 줄 것
이렇게 적혀있던데 다른 건 뭐 가독성이나 안전상의 이유 같은 걸로 납득할 수 있는데
한 줄 쓸 때도 {}
을 쓰라는 건 이해가 안돼요.
제가 보기에는 소스코드 1같이 쓰는 건 코드가 더러워 보이기만 하는데 무슨 장점이 있길래 저렇게 쓰라는 거죠?
소스코드1
int j = 0;
for (int i = 0 ; i < 100 ; ++i)
{
if (i % 2 == 0)
{
j++;
}
}
소스코드2
int j = 0;
for (int i = 0 ; i < 100 ; ++i)
if (i % 2 == 0)
j++;
1 답변
-
예를 들어서 설명하겠습니다.
상황1
소스코드 2에 변수 j를 추가해서 j와 i를 같이 증가시키는 코드로 바꿔봅시다.
int j = 0; for (int i = 0 ; i < 100 ; ++i) if (i % 2 == 0) j++; i++;
파이썬에서는 의도한 대로 실행될겁니다. 하지만 c++에서는 밑의 코드같이 실행됩니다.
int j = 0; for (int i = 0 ; i < 100 ; ++i) if (i % 2 == 0) j++; i++;
상황2
다음은 코드를 테스트하는 상황에서 자주 발생하는 일입니다.
if (condition) do_something(); else do_something_else(); must_always_do_this();
와 같은 코드에서
else
안의do_something_else()
를 주석처리하면if (condition) do_something(); else //do_something_else(); must_always_do_this();
컴파일은 되지만 항상 호출돼야 하는
must_always_do_this()
이else
문으로 들어가서 프로그램이 의도한 대로 실행되지 않습니다.물론 이런 상황들은 조금만 주의를 기울인다면 발생하지 않을 사소한 실수지만, 다들 한 번 씩 이런 경험해본 적 있지 않나요?
이건 c++이 {}로 블록을 정하기 때문에, 눈으로 보고 예상하는 블록과 실제 블록이 달라 발생하는 일입니다.
그래서 소스코드 1처럼
{}
을 써주는게 블록을 따라가기가 쉽기 때문에 한 줄을 쓰더라도{}
을 명시하라고 하는겁니다.하지만 항상 저 교재를 따를 필요는 없다고 생각합니다. 나중에 코드를 바꿀 일이 있다거나 다른 사람이랑 같이 쓰는 코드라면
{}
으로 묶어주는 게 좋겠지만, 간단한 조건 검사에서는 굳이 그럴 필요는 없지 않을까요?
댓글 입력