source

++i와 i++의 차이점은 무엇입니까?

goodcode 2022. 9. 1. 23:15
반응형

++i와 i++의 차이점은 무엇입니까?

C를 사용하는 과 C를 사용하는 것의 입니까?++i ★★★★★★★★★★★★★★★★★」i++가 있습니다.for 루우프? 루우프?

  • ++i will 。i하다

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++ will 。i, 원래 인 ᄃ, ᄃ, ᄃ는 값을 i이치노

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

for프,,, 어든든든든다 다다다다다다 ++iK&R에서 사용되는 제품이기 때문에 더 흔해 보입니다.

, 「 」의 라인에 따라 주세요.++i에 걸쳐서i++ 않을 것입니다잘못하지 않을 겁니다.

에 대한 이 몇 ++i ★★★★★★★★★★★★★★★★★」i++학생 이외의 프로젝트 컴파일러에서는 퍼포먼스에 차이가 없습니다.동일한 코드를 생성함으로써 이를 확인할 수 있습니다.

효율성에 대한 질문은 흥미롭습니다.제 대답은 다음과 같습니다.C의 i++와 ++i의 성능 차이가 있습니까?

@OnFreund가 지적했듯이 C++ 오브젝트는 다릅니다.operator++()함수로 컴파일러는 중간값을 유지하기 위해 임시 객체 생성을 최적화하는 방법을 알 수 없습니다.

i++Post Increment 라고 불리며 ++iPre Increment 라고 불립니다.

i++

i++는 post increment입니다. increment는 post increment이기 입니다.i1로 하다.

다음으로 예를 제시하겠습니다.

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

은 「」입니다.j = 1i = 2은 .입니다.i에 할당됩니다.j, 그 다음에, 그 다음에i가합니니다다

++i

++i는 프리 입니다.이것은, 「」가 증가하기 입니다.i1번으로 하다즉,j = i;i++

다음으로 예를 제시하겠습니다.

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

은 「」입니다.j = 2i = 2은 .입니다.i에 할당됩니다.ji가가의 i. 유사하게++i will will will will will willj=i;.

For 루프의 증분 블록에서 사용해야 하는 질문은 무엇입니까?정답은 아무 거나 쓸 수 있다는 거예요상관없어.For loop은 같은 횟수만큼 실행됩니다.

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.

유일한 차이점은 변수의 증분과 연산자가 반환하는 값 사이의 연산 순서입니다.

이 코드와 그 출력은 그 차이를 설명합니다.

#include<stdio.h>

int main(int argc, char* argv[])
{
  unsigned int i=0, a;
  printf("i initial value: %d; ", i);
  a = i++;
  printf("value returned by i++: %d, i after: %d\n", a, i);
  i=0;
  printf("i initial value: %d; ", i);
  a = ++i;
  printf(" value returned by ++i: %d, i after: %d\n",a, i);
}

출력은 다음과 같습니다.

i initial value: 0; value returned by i++: 0, i after: 1
i initial value: 0;  value returned by ++i: 1, i after: 1

기본적으로는 '아예'입니다.++i는 값이 후 하고, 는 값을 반환한다.i++값이 증가하기 전에 값을 반환합니다. 경우 "" " " " " " 입니다.i값이 증가합니다.

또 다른 예는 다음과 같습니다.

#include<stdio.h>

int main ()
  int i=0;
  int a = i++*2;
  printf("i=0, i++*2=%d\n", a);
  i=0;
  a = ++i * 2;
  printf("i=0, ++i*2=%d\n", a);
  i=0;
  a = (++i) * 2;
  printf("i=0, (++i)*2=%d\n", a);
  i=0;
  a = (++i) * 2;
  printf("i=0, (++i)*2=%d\n", a);
  return 0;
}

출력:

i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2

여러 번 차이가 없다

이 다른 되어 있는 동작 (즉, 합니다).i++*2++i*2(i++)*2 ★★★★★★★★★★★★★★★★★」(++i)*2같은 값을 반환한다)는 대부분의 경우 서로 교환할 수 있습니다.을 뜻합니다.

for(int i=0; i<10; i++)

와 같은 효과가 있다

for(int i=0; i<10; ++i)

기억해야 할 규칙

두 연산자를 혼동하지 않기 위해 이 규칙을 채택했습니다.

.++ 「」에 대해서, 「」에 .i의 주문하려면.++

그런 다른 말로:

  • ++ i수단 증분 할당하기 전에;수행해야 한다.
  • ++ i수단 증분 할당 후:수행해야 한다.

i++:이 시나리오에서는 국내에 가치고 증가 일이 배정된다.

++i: 이이 할당됩니다 」 。

아래는 이미지를 시각화와 또한 이곳에서 같은 방법을 보여 줍니다 좋은 실용적인 비디오이다.

여기에 이미지 설명 입력

++i

i++증분하다

그것은 미묘한 차이점이다.

의 경우 For, 를 사용합니다.++i i++그저 버려진다 여분의 복사본을 불러일으킬 겁니다

둘 다 숫자를 늘립니다. ++i i = i + 1.

i++ ★★★★★★★★★★★★★★★★★」++i매우 유사하지만 완전히 동일하지는 않습니다.둘 다 숫자를 늘립니다만,++i평가되기 전의 시키는 반면, 는 현재 을 평가하기 전의 수를 증가시킵니다.i++는 식이 평가된 후 수를 늘립니다.

예:

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3

어느 쪽이 빠른지에 대해서는, 「효율성」(실제로 속도)에 대해서는 염려하지 말아 주세요.요즘 컴파일러들이 이런 것들을 처리해주고 있어요.사용법이 맞는 것을 사용하세요.그것에 근거해, 당신의 의도를 보다 명확하게 알 수 있습니다.

★★++i 보다 약간 빠를 수 있다i++라는 것이다.i++는 값이 에 i 값의 할 수 「i」의 값이 증가하기 전에, 「i」의 복사가 필요하게 됩니다.++i절대 그렇지 않아요. 컴파일러가 가능한 은 아니지만하는 것은 .하지만 항상 가능한 것은 아닙니다.또, 모든 컴파일러가 이것을 실행하는 것은 아닙니다.

Fox의 다 할 수 는 Ryan Fox를 합니다.++i

루프에서 어느쪽인가를 사용했을 경우의 유효 결과는 동일합니다.즉, 루프는 두 가지 경우 모두 동일한 동작을 수행합니다.

효율의 측면에서는 ++i가 아닌 i++를 선택할 때 패널티가 발생할 수 있습니다.언어 사양의 관점에서, post-increment 연산자를 사용하면 연산자가 동작하는 값의 추가 복사본을 생성해야 합니다.추가 작업의 원인이 될 수 있습니다.

단, 앞의 논리에 관한 두 가지 주요 문제를 고려해야 합니다.

  1. 최신 컴파일러는 훌륭합니다.모든 좋은 컴파일러는 for-loop에서 정수 증가를 볼 수 있을 정도로 똑똑하며, 두 가지 방법을 모두 동일한 효율적인 코드로 최적화합니다.프리 인크리먼트보다 포스트 인크리먼트를 사용하면 실제로 프로그램 실행 시간이 느려지는 경우 컴파일러가 제대로 작동하지 않습니다.

  2. 운용 시간의 복잡성에 관해서는, (복사가 실제로 행해지고 있는 경우라도)두 가지 방법은 동일합니다.루프 내부에서 실행되는 명령의 수가 증분 동작의 수를 크게 좌우해야 합니다.따라서 유의한 크기의 루프에서는 루프 본체의 실행에 의해 증분 방식의 패널티가 크게 가려집니다.즉, 증분이 아니라 루프의 코드의 최적화에 대해 염려하는 것이 훨씬 좋습니다.

내 생각에, 모든 문제는 단순히 스타일 선호로 귀결된다.사전 인크리먼트가 읽기 쉽다고 생각되는 경우는, 그것을 사용해 주세요.개인적으로는 포스트 인크루먼트를 선호합니다만, 그 이유는 최적화에 대해 알기 전에 배운 내용이기 때문일 것입니다.

이는 조기 최적화의 전형적인 예이며, 이와 같은 문제는 설계상의 심각한 문제로부터 주의를 분산시킬 수 있습니다.그러나 "베스트 프랙티스"에서 사용법이나 합의가 통일되지 않기 때문에 여전히 물어보는 것은 좋은 질문이다.

간단하게 말하면, 다음의 이미지를 참조해 주세요.

여기에 이미지 설명 입력

예:

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

j는 「」입니다.1

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

j는 「」입니다.2

주의: 두 경우 모두i은 「」입니다.2

++i(그냥)합니다.
(예:)int i = 5,int b = ++i이 경우 6이 먼저 b에 할당되고 다음으로 7로 증가합니다.

i++( 트트픽 ( ( (: ).
(예:)int i = 5,int b = i++이 경우 5가 먼저 b에 할당되고 다음으로 6으로 증가합니다.

loop의 : " "의 경우:i++인 '아까보다'를 하기 때문에 주로 합니다.일반적으로 우리는 의 시작값을 사용합니다.i루프가 증가하기 전에.그러나 프로그램 논리에 따라 다를 수 있습니다.

++i는이고, 는 포스트패키지입니다 는 프리프로세서이고, 다른 하나는 포스트프로세서입니다.

i++ 요소를 가져온 후 증분합니다.
++i: i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-

예:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

출력:

i: 0
i++: 0
++i: 2

i++ 및 ++i

이 작은 코드는 이미 게시된 답변과 다른 각도에서 차이를 시각화하는 데 도움이 될 수 있습니다.

int i = 10, j = 10;
  
printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);
  
printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);

결과는 다음과 같습니다.

//Remember that the values are i = 10, and j = 10

i is 10 
i++ is 10     //Assigns (print out), then increments
i is 11 

j is 10 
++j is 11    //Increments, then assigns (print out)
j is 11 

전후 상황에 주의하세요.

포루프

그 중 어느 것을 for 루프의 증분 블록에 사용할지에 대해서는, 결정을 내리기 위해서 할 수 있는 최선의 방법은, 좋은 예를 사용하는 것이라고 생각합니다.

int i, j;

for (i = 0; i <= 3; i++)
    printf (" > iteration #%i", i);

printf ("\n");

for (j = 0; j <= 3; ++j)
    printf (" > iteration #%i", j);

결과는 다음과 같습니다.

> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3 

당신은 어떨지 모르겠지만 적어도 for 루프에서는 사용방법에 차이가 없습니다.

다음 C 코드 fragment는 사전 연산자와 사후 증분 연산자 및 감소 연산자의 차이를 나타냅니다.

int  i;
int  j;

연산자 증가:

i = 1;
j = ++i;    // i is now 2, j is also 2
j = i++;    // i is now 3, j is 2

잠시 후:

++i ★★★★★★★★★★★★★★★★★」i++함수에 쓰지 않는 경우에도 동일하게 동작합니다.이런 걸 쓰면function(i++) ★★★★★★★★★★★★★★★★★」function(++i)을 사용하다

function(++i)하고, 그 에 이 i를 1로 , 이 i를 1로 하다, 라고 합니다.i함수에 새로운 가치를 부여합니다.

function(i++)하다 라고.i됩니다.i1파운드 요.

int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now

Pre-creation은 같은 줄에 증분을 의미합니다.포스트 인크리먼트는 라인 실행 후 인크리먼트를 의미합니다.

int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.

int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes

OR 연산자와 AND 연산자가 함께 있으면 더 흥미로워집니다.

int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}

int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}

어레이 내

System.out.println("In Array");
int[] a = { 55, 11, 15, 20, 25 } ;
int ii, jj, kk = 1, mm;
ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
System.out.println(a[1]); //12

jj = a[1]++; //12
System.out.println(a[1]); //a[1] = 13

mm = a[1];//13
System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13

for (int val: a) {
     System.out.print(" " +val); //55, 13, 15, 20, 25
}

C++ 포인터 변수의 post/pre-increment에서

#include <iostream>
using namespace std;

int main() {

    int x=10;
    int* p = &x;

    std::cout<<"address = "<<p<<"\n"; //prints address of x
    std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
    std::cout<<"address = "<<&x<<"\n"; //prints address of x

    std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}

주요 차이점은

  • i++ 투고(증가 후) 및
  • ++i 사전(증가 전)

    • i =11,2,3,4,n
    • i =12,3,4,5,n

이 차이는 아래의 간단한 C++ 코드로 알 수 있습니다.

int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;

이제 의미론의 차이를 이해하셨으리라 생각합니다(솔직히 왜 사람들이 책이나 웹 튜토리얼 같은 것을 읽는 것보다 스택 오버플로에 대해 '연산자 X가 무엇을 의미하는지' 질문을 하는지 궁금하네요).

그러나 어쨌든 어느 쪽을 사용하는지에 대해서는 C++에서도 중요하지 않은 퍼포먼스에 관한 질문은 무시해 주십시오.사용할 항목을 결정할 때 사용해야 하는 원칙은 다음과 같습니다.

무슨 뜻인지 암호로 말해라.

스테이트먼트에 value-before-increment가 필요 없는 경우 해당 형식의 연산자를 사용하지 마십시오.이것은 사소한 문제이지만, 한 버전을 다른 버전에 유리하게 금지하는 스타일 가이드(일명 골수 스타일 가이드)를 사용하는 것이 아니라면, 여러분은 여러분이 하려는 것을 가장 정확하게 표현하는 형식을 사용해야 합니다.

QED, 사전 증분 버전을 사용합니다.

for (int i = 0; i != X; ++i) ...

a=i++는 contains current i value a=++i를 의미하며, 는 증가된 i value를 포함합니다.

다음은 그 차이를 이해하기 위한 예입니다.

int i=10;
printf("%d %d",i++,++i);

력::10 12/11 11에에 따라 ).printf컴파일러 및 아키텍처에 따라 다름)

명::i++->i이지만, 10자). (10자, 10자, 10자i 11이 되다)++i->i 는 12값)i12)

내부 변환은 여러 개의 문장으로 생각할 수 있습니다.

// case 1

i++;

/* you can think as,
 * i;
 * i= i+1;
 */



// case 2

++i;

/* you can think as,
 * i = i+i;
 * i;
 */

언급URL : https://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i

반응형