증감연산자가 어떤 때 쓰이는지 궁금합니다.

코딩하다가 드는 생각인데 도대체
++i나 i++는 왜 사용하고 어떤 때에 사용되는지 이해가 안 가는데 알려주실 수 있나요?

int foo = 0, bar = 0;

foo = bar++; // foo = 0, bar = 1
foo = ++bar; // foo = 2, bar = 2

할당하고 더하냐 더하고 할당하냐 차이인데,

단독으로 쓸 때는 크게 차이가 없습니다. 그냥 bar = bar + 1 의 의미거든요.
실제로 컴파일러가 컴파일 할때도 동일하게 컴파일합니다.

1 Like
i = i + 1;
++i;

옛날에는 요거 두 개가 속도 차이가 났는데 요즘은 그런 거 없습니다.
그냥 코딩 할 때 적게 칠 수 있고 빨라서?

++i;
i++;

이거는 아시다시피 증감시킬 타이밍에 따라 다르게 쓰이는데요,
제 경험으로는 주로 배열 내 원소에 접근할 때

arr[i++]=x;

요런 식으로 쓰는 걸 주로 본 거 같습니다.

1 Like

감사합니다 ㅎ

잘 이해가 안 되는 부분이였는데 감사합니다 ㅎ

i++과 ++i에 차이에 대해서 말하자면 int같은 primitive data type에서는 차이가 없으나, 증감연산자를 overloading 해놓은 class를 다룰 때는 유의하셔야 합니다. :frowning:

int 같이 언어에서 제공하는 primitive data types 경우에는 컴파일러에서 최적화를 하여 속도 차이가 유의미하지 않도록 한 경우도 있으나, 사용자가 정의하는 class의 경우는 최적화가 불가능 합니다. post-increment 혹은 post-decrement 연산자를 overloading 하는 경우 내부적으로 임시 객체를 생성하게 되며 이는 pre-increment 혹은 pre-decrement 연산자를 사용할 때보다 명확하게 속도에서 불리합니다.

자세한 것은 아래 링크에서 코드 예시와 함께 설명이 있으니 참고하세용.

아래는 Test code & Test result 입니다. int와 vector iterator를 가지고 증감연산자 속도 테스트를 간단하게 했습니다. int의 경우는 유의미한 차이가 없지만, vector iterator의 경우 유의미한 차이가 보이죠~
임시 객체의 생성 비용이 크면 클 수록 더 많은 차이를 보인답니다.

Test code
#include <chrono>
#include <iostream>
#include <string>
#include <vector>

#define MAX_COUNT 100000000

template<typename Function, typename ...Params>
void PrintExecutionTime(std::string name, Function function, Params&&... params) {
  auto start = std::chrono::high_resolution_clock::now();
  function(std::forward<Params>(params)...);
  auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
      std::chrono::high_resolution_clock::now() - start);
  std::cout << name << ": "<< duration.count() << " ms" << std::endl;
}

std::vector<int> vec(MAX_COUNT);

int main(int argc, char** argv)
{
  PrintExecutionTime("pre-increment int test", []() {
    for (int i = 0; i < MAX_COUNT; ++i); });

  PrintExecutionTime("post-increment int test", []() {
    for (int i = 0; i < MAX_COUNT; i++); });

  PrintExecutionTime("pre-increment vector iterator test", []() {
    for (auto&& it = vec.begin(); it != vec.end(); ++it); });

  PrintExecutionTime("post-increment vector iterator test", []() {
    for (auto&& it = vec.begin(); it != vec.end(); it++); });

  return 0;
}

Test result
$ g++ src/main.cpp && ./a.out
pre-increment int test: 148 ms
post-increment int test: 147 ms
pre-increment vector iterator test: 909 ms
post-increment vector iterator test: 1280 ms

증감 연산자를 쓰는 경우는 1씩 증감하는 것을 간단하게 표현 할 수도 있고,
다음 iterator에 접근할 때, 이전 iterator를 접근할 때 많이 사용한답니다.

8 Likes

사용하신 편집기 여쭤보고 싶습니다! 되게 아기자기 이쁘네요…

상세한 답변에 많은 도움이 되었습니다.
감사합니다.

ubuntu18.04에서 쓰는 vs code 입니다. :slight_smile:

1 Like