i = (i, ++i, 1) + 1;는 어떤 순서로 실행되나요?

조회수 1726회

소스코드

#include <stdio.h>

int main(void) {
  int i = 5;
  i = (i, ++i, 1) + 1;
  printf("%d\n", i);
  return 0;
}

발생하는 문제 및 실행환경

Undefined behavior에 대해서 공부하고 있는 뉴비입니다.

연산자로 이것저것 실험해보다가 이런 코드를 만들었는데요 코드를 실행하면 2가 나오는데 제가 만든 코드에서는 감소시키는 연산자가 하나도 없어서 2가 나올 일이 없습니다. 왜 2가 나온 걸까요?

그리고 저걸 실행하면 이런 경고가 뜨는데 왜죠?

warning

px.c:5:8: warning: left-hand operand of comma expression has no effect

  [-Wunused-value]   i = (i, ++i, 1) + 1;
                        ^

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    코드를 이해하려면 (i, ++i, 1)에 콤마를 봐야 합니다.

    위키피디아에서는

    the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type). Because it discards its first operand, it is generally only useful where the first operand has desirable side effects. If the side effect to the first operand does not takes place, then the compiler may generate warning about the expression with no effect.

    라고 하네요. 해석해보면 ,는 2개의 피연산자를 받는 연산자고, 첫 번째 피연산자 계산(evaluates) 후 그 결과는 버리고 두 번째 피연산자를 계산한 값을 return합니다.

    이제 질문으로 넘어가기 전에 설명하기 쉽게 (i, ++i, 1) + 1;에 임시로 i에 순서대로 숫자를 붙이겠습니다. (i1, ++i2, 1) + 1;

    1. 맨 앞의 피연산자 i1를 계산하고 i1을 버립니다. 여기선 아무것도 하는 게 없어 여기서 no effect 경고를 보내줍니다.
    2. 피연산자 ++i2를 계산해 i 값을 하나 증가시킵니다. 그리고 i2도 버리지요.
    3. 마지막으로는 피연산자 1로 넘어와서 1을 return 합니다.

    이 과정을 다르게 쓰면

    i;          // i를 evaluate하고 결과는 버림 -> 아무런 영향도 없음
    ++i;        // ++i를 evaluate하고 결과는 버림. 5였던 i가 6이 됨
    i = 1 + 1;  // 마지막 피연산자 1과 괄호 밖의 1을 더해줌
    

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.