문제

C에서 사용하는 것의 차이점은 무엇입니까? ++i 그리고 i++, 그리고 이는 a의 증분 블록에 사용되어야 합니다. for 고리?

도움이 되었습니까?

해결책

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

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

  • i++i의 값을 증가 시키지만 증가되기 전에 i가 보유한 원래 값을 반환합니다.

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

    for 루프의 경우 둘 다 작동합니다. ++i K & R 에서 사용되는 코드이기 때문에 더 일반적으로 보입니다.

    어쨌든 "++i보다 i++ 선호"가이드 라인을 따르십시오. 그러면 잘못되지 않을 것입니다.

    ++ii++의 효율성에 대한 몇 가지 의견이 있습니다. 학생 프로젝트가 아닌 컴파일러에서는 성능 차이가 없습니다. 동일한 코드를 생성하여 확인할 수 있습니다.

    효율성에 대한 질문이 흥미 롭습니다. 여기에 대한 제 답변이 있습니다. C에서 i ++와 ++ i의 성능 차이가 있습니까?

    On Freund 가 언급했듯이, operator++()는 함수이고 컴파일러는 중간 값을 보유하기 위해 임시 객체 생성을 최적화하는 것을 알 수 없기 때문에 C ++ 객체의 경우 다릅니다.

다른 팁

i ++ 사후 증가 라고하며 ++ i 사전 증가 라고합니다.

i++

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

다음 예를 보겠습니다. 라코 디스

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

++i

++i는 작업 전에 i의 값을 1 씩 증가시키기 때문에 사전 증가입니다. 이는 j = i;i++ 다음에 실행됨을 의미합니다.

다음 예를 보겠습니다. 라코 디스

여기에 j = 2의 값이 있지만 i = 2입니다. 여기서 i의 값은 ji 증가 후 i에 할당됩니다. 마찬가지로 ++ij=i;보다 먼저 실행됩니다.

for 루프의 증분 블록에서 사용해야하는 질문에 대해 대답은 아무거나 사용할 수 있습니다 .. 중요하지 않습니다. for 루프를 동일한 번호로 실행합니다. 여러 번. 라코 디스

그리고 라코 디스

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

어디서 사용하는지 만 중요합니다. 라코 디스

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

어떤 것이 더 빠른지 "효율"(실제로 속도)에 대해 걱정하지 마십시오.요즘 우리는 이러한 것들을 처리하는 컴파일러를 가지고 있습니다.당신의 의도를 더 명확하게 보여주는 것을 기준으로 사용하기 합리적입니다.

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

i++는 값을 반환 한 다음 증분합니다.

미묘한 차이입니다.

for 루프의 경우 약간 더 빠르므로 ++i를 사용하세요.i++는 버려지는 추가 사본을 생성합니다.

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

++i :이 시나리오에서는 먼저 증가가 수행 된 다음 값이 할당됩니다.

아래는 이미지 시각화입니다.동일합니다.

여기에 이미지 설명 입력

++ii++보다 약간 더 빠를 수 있는 이유는 i++가 증가하기 전에 i 값의 로컬 사본을 요구할 수 있지만 ++i는 절대 필요하지 않기 때문입니다.경우에 따라 일부 컴파일러는 가능한 경우이를 최적화합니다.하지만 항상 가능한 것은 아니며 모든 컴파일러가이를 수행하는 것은 아닙니다.

컴파일러 최적화에 너무 많이 의존하지 않으려 고하므로 Ryan Fox의 조언을 따를 것입니다. 둘 다 사용할 수 있으면 ++i를 사용합니다.

둘 중 하나를 사용한 결과는 동일합니다. 즉, 루프는 두 경우 모두 똑같은 작업을 수행합니다.

효율성 측면에서 ++ i보다 i ++를 선택하면 불이익이있을 수 있습니다. 언어 사양과 관련하여 post-increment 연산자를 사용하면 연산자가 작동하는 값의 추가 복사본을 만들어야합니다. 이것은 추가 작업의 원천이 될 수 있습니다.

그러나 앞의 논리에서 두 가지 주요 문제를 고려해야합니다.

  1. 현대 컴파일러는 훌륭합니다. 모든 좋은 컴파일러는 for 루프에서 정수 증가가 발생한다는 것을 인식 할만큼 똑똑하며 두 메서드를 동일한 효율적인 코드로 최적화합니다. 사전 증가보다 사후 증가를 사용하면 실제로 프로그램 실행 시간이 느려진다면 끔찍한 컴파일러를 사용하는 것입니다.

  2. 작업 시간 복잡도 측면에서 두 가지 방법 (실제로 복사가 수행되고 있더라도)은 동일합니다. 루프 내에서 수행되는 명령어의 수는 증가 연산의 연산 수를 상당히 지배해야합니다. 따라서 상당한 크기의 루프에서 증가 메서드의 페널티는 루프 본문의 실행으로 인해 엄청나게 가려집니다. 즉, 증분보다는 루프에서 코드를 최적화하는 것에 대해 걱정하는 것이 훨씬 낫습니다.

    제 생각에는 전체 문제는 단순히 스타일 선호도로 귀결됩니다. 사전 증가가 더 읽기 쉽다고 생각한다면 그것을 사용하십시오. 개인적으로 저는 포스트 인크 리먼 트를 선호하지만 최적화에 대해 알기 전에 배웠기 때문일 것입니다.

    이는 조기 최적화의 전형적인 예이며 이와 같은 문제는 설계의 심각한 문제에서 우리를 산만하게 할 가능성이 있습니다. 그러나 "모범 사례"에 대한 통일성 또는 합의가 없기 때문에 여전히 물어 보는 것은 좋은 질문입니다.

둘 다 숫자를 증가시킵니다.++ii = i + 1와 동일합니다.

i++++i는 매우 유사하지만 정확히 동일하지는 않습니다.둘 다 숫자를 증가 시키지만 ++i는 현재 표현식이 평가되기 전에 숫자를 증가시키는 반면 i++는 표현식이 평가 된 후에 숫자를 증가시킵니다.

예 : 라코 디스

++i (접두사 연산) : 값을 늘린 다음 할당
(예) : int i = 5, int b = ++i 이 경우 먼저 6이 b에 할당 된 다음 7로 증가하는 식입니다.

i++ (Postfix 연산) : 값을 할당 한 다음 증가
(예) : int i = 5, int b = i++ 이 경우 먼저 5가 b에 할당 된 다음 6으로 증가하는 식입니다.

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

++i : 사전 증가이고 다른 하나는 사후 증가입니다.

i++ : 요소를 가져온 다음 증분합니다.
++i : i를 증가시킨 다음 요소를 반환합니다.

예 : 라코 디스

출력 : 라코 디스

이제 의미의 차이를 이해했다고 가정합니다 (솔직히 사람들은 읽는 대신 스택 오버플로에 대해 '연산자 X의 의미'질문을합니다. 책이나 웹 튜토리얼 같은 것입니다.

그러나 어쨌든 어느 것을 사용할 지에 관해서는 성능 문제를 무시하십시오. C ++에서도 중요하지 않습니다.이것은 결정할 때 사용해야하는 원칙입니다. 사용할 항목 :

코드에서 의미하는 바를 말하세요.

문에 증분 전 값이 필요하지 않은 경우 해당 형식의 연산자를 사용하지 마십시오.사소한 문제이지만 금지하는 스타일 가이드를 사용하지 않는 한 다른 버전 (일명 뼈 머리 스타일 가이드)을 선호하는 경우 수행하려는 작업을 가장 정확하게 표현하는 형식

QED, 사전 증분 버전 사용 : 라코 디스

아래의 간단한 C ++ 코드로 차이점을 이해할 수 있습니다. 라코 디스

<인용구>

주요 차이점은

  • i ++ Post ( 증가 후 ) 및
  • ++ i Pre ( 증가 전 )

    • i =1 경우 루프가 1,2,3,4,n처럼 증가하면 게시
    • i =1가 루프를 2,3,4,5,n처럼 증가시키는 경우

i ++ 및 ++ i

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

결과는 다음과 같습니다. 라코 디스

전후 상황에주의하세요.

for 루프

for 루프의 증분 블록에서 그 중 하나를 사용해야하는 경우 결정을 내리기 위해 할 수있는 최선의 방법은 좋은 예를 사용하는 것입니다. 라코 디스

결과는 다음과 같습니다. 라코 디스

나는 당신에 대해 모르지만 적어도 for 루프에서는 사용법에 차이가 없습니다.

다음 C 코드 조각은 사전 및 사후 증가 및 감소 연산자의 차이점을 보여줍니다. 라코 디스

증가 연산자 : 라코 디스

사전 생성은 같은 줄에서 증가 함을 의미합니다.사후 증가는 행이 실행 된 후 증가 함을 의미합니다. 라코 디스

OR, AND 연산자와 함께 사용하면 더욱 흥미로워집니다. 라코 디스

배열 라코 디스

C ++에서 포인터 변수의 사후 / 사전 증가 라코 디스

간단히 :

++ii++는 함수에 작성하지 않는 경우 동일하게 작동합니다.function(i++) 또는 function(++i)와 같은 것을 사용하면 차이를 확인할 수 있습니다.

function(++i)는 첫 번째 i가 1 씩 증가한다고 말한 다음이 i를 새로운 값으로 함수에 넣습니다.

function(i++)i를 1 씩 증가시킨 후 첫 번째 i를 함수에 넣습니다. 라코 디스

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

이 코드와 해당 출력은 차이점을 설명합니다.

#include<stdio.h>

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

출력은 다음과 같습니다

i before: 1; value returned by i++: 0, i after: 1
i before: 1; 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 루프 구문입니다:

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

와 같은 효과가 있습니다

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

기억해야 할 규칙

두 연산자 사이에 혼동을 일으키지 않기 위해 나는 다음 규칙을 채택했습니다.

운영자의 위치를 ​​연관시키다 ++ 변수에 관해서 i 의 순서대로 ++ 임무와 관련된 운영

즉, 다음과 같이 말했습니다.

  • ++ ~ 전에 i 증분을 수행해야 함을 의미합니다. ~ 전에 과제;
  • ++ ~ 후에 i 증분을 수행해야 함을 의미합니다. ~ 후에 과제:

내부 변환을 여러 문장 으로 생각할 수 있습니다. 라코 디스

a= i ++는 a가 현재 i 값을 포함 함을 의미합니다. a= ++ i는 a에 증가 된 i 값이 포함되어 있음을 의미합니다.

다음은 차이점을 이해하는 예입니다. 라코 디스

출력 : 10 12/11 11 (printf 함수에 대한 인수 평가 순서에 따라 다름, 컴파일러 및 아키텍처에 따라 다름)

설명 : i++-> i가 인쇄 된 다음 증가합니다.(10을 인쇄하지만 i는 11이됩니다.) ++i-> i 값은 값을 증분하고 인쇄합니다.(12를 인쇄하고 i의 값도 12)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top