Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 while 및 if 문 뒤에 세미콜론을 붙이면 어떻게 될까?

C++에서 조건문 뒤의 세미콜론, 왜 문제가 될까?

C++ 코드를 작성하다 보면 실수로 조건문 바로 뒤에 세미콜론(;)을 붙이는 경우가 있습니다. 예를 들어 다음과 같은 코드가 있다고 가정해 봅시다.

while (expression);

이 경우 while 루프는 표현식(expression)이 참이든 거짓이든 상관없이 동작합니다. 마찬가지로 아래와 같은 코드에서도,

if (expression);

if 문에 속한 실행문은 표현식의 참·거짓 여부와 관계없이 항상 실행됩니다. 그렇다면 이런 현상이 발생하는 이유는 무엇일까요?

if와 while의 기본 문법 구조

핵심은 if와 while의 문법 구조에 있습니다. 두 구문 모두 다음과 같은 형태를 가집니다.

if (<expr>) <statement>
// 또는
while (<expr>) <statement>

즉, <statement>(실행문)는 오직 <expr>(조건식)이 참으로 평가될 때만 실행됩니다. 특히 while의 경우 조건식 뒤에 세미콜론이 붙으면 빈 문장을 계속 반복하게 되어 무한 루프(infinite loop)에 빠질 수 있습니다.

세미콜론은 '빈 문장'을 의미한다

그렇다면 세미콜론이 붙었을 때 컴파일러는 어떤 문장을 실행하는 걸까요? 중괄호 {}로 묶인 블록이 없다면, 세미콜론으로 끝나는 바로 다음 문장이 실행 대상이 됩니다. 그리고 그 문장이 비어 있더라도(EMPTY) 유효한 문장으로 간주된다는 점이 중요합니다.

if (<expr>) /* 빈 문장 */;
while (<expr>) /* 빈 문장 */;

위 두 경우 모두 조건식이 평가된 이후에는 실제로 실행되는 내용이 전혀 없습니다. 다만 while문은 조건이 참을 유지하는 한 빈 문장을 무한히 반복하며 무한 루프에 빠질 수 있다는 점에 유의해야 합니다.

중괄호 {}의 역할

참고로 '{}'는 하나의 문장 블록(statement-block)입니다. 문장 블록 역시 일종의 문장이며, 내부에 여러 개의 문장 목록을 포함할 수 있습니다. 따라서 조건문 뒤에 중괄호를 사용하면 여러 문장을 하나의 단위로 묶어 조건에 따라 실행할 수 있습니다.

정리

  • 조건문 뒤에 세미콜론을 붙이면 '빈 문장'이 실행 대상이 됩니다.
  • if문의 경우 조건과 무관하게 이후 코드가 실행되는 것처럼 보일 수 있습니다.
  • while문의 경우 빈 문장을 반복하여 무한 루프에 빠질 위험이 있습니다.
  • 실수를 방지하려면 조건문 뒤에는 항상 중괄호 {}를 사용하는 습관을 들이는 것이 좋습니다.