[c] C : ++ i와 i ++의 차이점은 무엇입니까?

C에서 사용 차이 무엇인가 ++i하고 i++, 어느는 점진의 블록으로 표기 for루프?



답변

  • ++i의 값을 증가시킨 i다음 증가 된 값을 반환합니다.

     i = 1;
     j = ++i;
     (i is 2, j is 2)
  • i++의 값은 증가 i하지만 i증가하기 전에 유지 된 원래 값을 반환합니다 .

     i = 1;
     j = i++;
     (i is 2, j is 1)

A의 for루프 중 하나를 사용할 수 있습니다. K & R++i 에서 사용되기 때문에 더 일반적으로 보입니다 .

어떤 경우에는, “선호하는 지침을 따르 ++i통해 i++“당신은 잘못되지 않습니다.

++i및 의 효율성에 대한 몇 가지 의견이 있습니다 i++. 학생이 아닌 프로젝트 컴파일러에서는 성능 차이가 없습니다. 생성 된 코드를 보면이를 확인할 수 있으며 이는 동일합니다.

효율성 질문은 흥미 롭습니다 … 여기에 대한 대답
은 다음과 같습니다 .C에서 i ++과 ++ i 사이에 성능 차이가 있습니까?

@OnFreund가 지적 했듯이 함수 는 C ++ 객체와 다릅니다 operator++(). 컴파일러는 중간 값을 유지하기 위해 임시 객체 생성을 최적화하는 것을 알 수 없기 때문입니다.


답변

나는 ++ 로 알려져 포스트 증가 하는 반면 내가 ++ 라고 사전 증가.

i++

i++i작업이 끝난 후의 값을 1 씩 증가시키기 때문에 포스트 증가 입니다.

다음 예제를 보자.

int i = 1, j;
j = i++;

의 값이 여기에 j = 1있지만 i = 2. 여기에의 값이 먼저 i할당 된 j다음 i증가합니다.

++i

++ii연산 전에 값을 1 씩 증가시키기 때문에 사전 증가 입니다. 그것은 j = i;이후에 실행될 것임을 의미 i++합니다.

다음 예제를 보자.

int i = 1, j;
j = ++i;

의 값이 여기에 j = 2있지만 i = 2. 이 값은 증분 후에 i할당됩니다 . 이전에도 마찬가지로 실행 됩니다.jii++ij=i;

for 루프의 증분 블록에서 사용해야하는 질문 은 무엇입니까? 대답은, 당신은 하나를 사용할 수 있다는 것입니다 .. 중요하지 않습니다. for 루프와 동일한 no를 실행합니다. 시간.

for(i=0; i<5; i++)
   printf("%d ",i);

for(i=0; i<5; ++i)
   printf("%d ",i);

두 루프 모두 동일한 출력을 생성합니다. 즉 0 1 2 3 4.

사용하는 곳만 중요합니다.

for(i = 0; i<5;)
    printf("%d ",++i);

이 경우 출력은입니다 1 2 3 4 5.


답변

어느 쪽이 더 빠른 “효율”(실제 속도)에 대해 걱정하지 마십시오. 요즘에는 이러한 것들을 처리하는 컴파일러가 있습니다. 의도를보다 명확하게 보여주는 것에 따라 사용하기에 적합한 것을 사용하십시오.


답변

++i 값을 증가시킨 다음 반환합니다.

i++ 값을 반환 한 다음 증가시킵니다.

미묘한 차이입니다.

for 루프 ++i의 경우 약간 빠릅니다. i++그냥 버려지는 여분의 사본을 만듭니다.


답변

i++:이 시나리오에서는 먼저 값이 할당 된 다음 증분이 발생합니다.

++i:이 시나리오에서는 먼저 증분이 완료된 후 값이 할당됩니다.

아래는 이미지 시각화이며, 여기 에는 동일한 것을 보여주는 멋진 실용적인 비디오 가 있습니다.

여기에 이미지 설명을 입력하십시오


답변

그 이유는 ++i 보다 약간 빠를 i++IS i++가 증가되기 전에 동안, i 값의 로컬 복사본을 요구할 수 있습니다 ++i하지 않았다. 경우에 따라 일부 컴파일러는 가능한 경우 최적화를 수행하지만 항상 가능한 것은 아니며 모든 컴파일러가이를 수행하지는 않습니다.

컴파일러 최적화에 너무 의존하지 않기 때문에 Ryan Fox의 충고를 따를 것 ++i입니다. 둘 다 사용할 수 있으면을 사용 합니다.


답변

루프 중 하나를 사용하는 효과적인 결과는 동일합니다. 다시 말해, 루프는 두 경우 모두 똑같은 일을합니다.

효율성 측면에서 ++ i보다 i ++를 선택하면 패널티가 부과 될 수 있습니다. 언어 사양 측면에서, 증가 후 연산자를 사용하면 연산자가 작동하는 값의 추가 사본을 작성해야합니다. 이것은 추가 작업의 원천이 될 수 있습니다.

그러나 앞의 논리와 관련하여 두 가지 주요 문제를 고려해야합니다.

  1. 현대 컴파일러는 훌륭합니다. 모든 우수한 컴파일러는 for-loop에서 정수 증가를보고 있음을 알기에 충분히 똑똑하며 두 방법을 동일한 효율적인 코드로 최적화합니다. 사전 증분보다 증분 후를 사용하면 실제로 프로그램 실행 시간이 느려지는 경우 끔찍한 컴파일러를 사용하는 것 입니다.

  2. 작동 시간 복잡성 측면에서 두 가지 방법 (복사가 실제로 수행되는 경우에도)은 동일합니다. 루프 내에서 수행되는 명령 수는 증분 작업의 작업 수를 크게 좌우해야합니다. 따라서 크기가 큰 루프에서는 루프 본문을 실행하여 증가 방법의 페널티가 크게 어두워집니다. 다시 말해, 증분보다는 루프에서 코드를 최적화하는 것에 대해 걱정하는 것이 훨씬 좋습니다.

제 생각에는 전체 이슈가 단순히 스타일 선호로 요약됩니다. 사전 증분이 더 읽기 쉽다고 생각되면 사용하십시오. 개인적으로, 나는 증분 후를 선호하지만, 아마도 최적화에 대해 알기 전에 내가 배운 것이기 때문일 것입니다.

이것은 조기 최적화의 전형적인 예이며, 이와 같은 문제는 디자인의 심각한 문제에서 우리를 혼란스럽게 할 수 있습니다. 그러나 “모범 사례”에서 사용 또는 합의에있어 통일성이 없기 때문에 여전히 질문하는 것이 좋습니다.