상세 컨텐츠

본문 제목

if(ptr)ptr=NULL,return; 은 왜 안될까 (쉼표 연산자 이야기)

프로그래밍/테크닉

by ∫2tdt=t²+c 2009. 9. 13. 23:14

본문

c/c++로 코딩하다 보면 매우 간결한 조건문이 필요할 때가 있다. (예를 들어 인수가 잘못되어서 에러값을 리턴하는 경우처럼)
이럴 때는 {}를 사용하지 않고 한 줄 짜리 if문을 만드는 경우가 있다. 그런데 가끔씩 한 줄 짜리 if문에 두 가지 명령을 쑤셔넣으려고 다음과 같이 한다.

if(cond)a++,b++;

이는 아무 문제가 없다. 하지만 다음과 같은 경우는 문제가 발생한다.

if(error)free(ptr),return -1;

(아마 에러가 발생해서 그 전에 할당해놓은 메모리를 해제하고 리턴을 하는 모양이다.)
결국 다음과 같이 코드를 고치게 된다.

if(error)
{
  free(ptr);
  return -1;
}

왜 위의 경우는 되는데 아래의 경우는 안될까?

이는 c의 쉼표 연산자(,)를 잘못 이해한 결과이다.

쉼표 연산자는 단순히 2개 이상의 식을 묶어주는 역할을 하는것이 아니다.
차례대로 식을 수행하고 뒤의 것을 돌려주는게 쉼표연산자의 역할이다.

int a=50,60; 이라고 하면 a는 뒤의 것인 60이 된다.
int b=func(),70; 이라고 하면 func()이 호출되고, a는 70이 된다.

이제 if(error)free(ptr),return -1;에 무슨 문제가 있는지 알수 있겠다.

free(ptr), return -1; 을 수행하려하면 먼저 free(ptr)을 호출하고
return -1을 수행하여 결과값을 값을 돌려줄수 있어야한다.
그런데 return -1은 어떤 값을 가지는 식이 아니다. 따라서 저런 모양의 구문이 불가능하다.

break나 continue도 return과 마찬가지로 쉼표연산자에 쓸 수가 없다.
(c언어에서는 계산되어서 값이 나오는, 연산자들로 연결되는 것을 식이라하고, return 이나 break, continue 등등을 문이라고 한다. 연산자의 항으로 쓰일수 있는 것들은 식이지 문이 아니다.)

보너스 내용
하지만 쉼표연산자를 잘 이용하면 한 줄짜리 if문에 여러 명령을 잘 꾸겨넣을수 있다.

if(error)free(ptr), return -1;

위 문장은 안된다고 했다. 하지만 아래는 어떨까?

if(error)return free(ptr), -1;

오오 잘 된다. 그렇다면 이거는 어떻게 고칠수 있을까?

if(error)free(ptr), return;

흠 쉼표연산자를 사용해보려해도 리턴값이 없으니 어쩔 도리가 없어보이는데...

if(error)return free(ptr);

이렇게 고치면 된다.

그럼 이거는 어떻게 고칠 수 있을까?

if(error)ptr=NULL, return;

흠... 더 어려워졌는데... 어떻게 해야하지?

if(error)return (void)(ptr=NULL);

void로 캐스팅하면 된다!

하지만 나 같으면 그냥 {}쓰겠다. 저렇게 지저분하게 짜서 누구 보여주려구...

관련글 더보기

댓글 영역