프로그래밍C 개발자

C 언어에서 후위 및 전위 증가 연산(i++ 및 ++i)의 차이점을 설명하십시오. 어떤 경우에 각 변형을 사용해야 하며, 복잡한 표현식에서 이들이 어떻게 위험할 수 있는지 설명하십시오?

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어에서 후위(i++) 및 전위(++i) 증가 연산은 변수의 값을 1만큼 증가시키지만 반환 값이 다릅니다:

  • i++ (후위): 현재 값을 먼저 반환한 다음 증가시킵니다.
  • ++i (전위): 먼저 값을 증가시킨 다음 새 값을 반환합니다.

예:

int i = 5; int a = i++; // a == 5, i == 6 int j = 5; int b = ++j; // b == 6, j == 6

간단한 표현식에서는 차이가 미미하지만, 복잡한 표현식(예: 여러 번의 증가가 포함된 경우)에서는 정의되지 않은 동작이 발생할 수 있습니다.

트릭 질문

int a = i++ + ++i; 표현식이 실행된 후 변수 a의 값은 무엇일까요? (i = 1일 때)

답변:

계산은 피연산자의 계산 순서에 따라 달라지며, 이는 표준에서 보장되지 않으며, 변수 i가 값의 연속적인 사용 사이에 1회 이상 수정되기 때문에 정의되지 않은 동작(Undefined Behavior)을 초래합니다. 이렇게 작성하면 안 됩니다!

이러한 코드 예:

int i = 1; int a = i++ + ++i; // 정의되지 않은 동작! 이렇게 사용하지 마십시오!

주제에 대한 세부 사항 부족으로 인한 실제 오류의 예


이야기

큰 프로젝트에서 배열의 인덱스를 계산하는 코드가 arr[i++] = getValue(++i);로 작성되었습니다. 개발자는 이전 값을 유지하면서 동시에 새로운 값을 얻고자 했습니다. 서로 다른 컴파일러에서 동작이 달라져 가끔 하나의 값이 다른 값을 덮어쓰거나 프로그램이 충돌했습니다. 그 원인은 하나의 표현식에서 변수 i를 여러 번 수정하는 것이 허용되지 않기 때문입니다.


이야기

임베디드 프로젝트에서 카운터의 값이 복잡한 표현식의 일부로 증가했습니다: if (buffer[i++] == TERMINATOR && ++i < SIZE) ... — 하드웨어에서 종종 잘못된 인덱스가 생성되어 초기화되지 않은 데이터를 읽는 경우가 발생했습니다.


이야기

코드를 다른 컴파일러로 포팅할 때 피연산자의 계산 순서 구현 차이로 인해 while (arr[i++] && i < MAX && arr[++i]) 같은 루프가 예측할 수 없는 동작을 하게 되었습니다. 버그는 클라이언트 기기에서 테스트 단계 결과로만 발견되었습니다.