C ++에서“->”연산자는 무엇입니까?

읽고 나면 숨겨진 기능 및 C ++ / STL의 어두운 구석을comp.lang.c++.moderated, 나는 완전히 다음은 컴파일 및 Visual Studio 2008 및 G ++ 4.4 모두에서 일 니펫 것을 놀랐습니다.

코드는 다음과 같습니다.

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

산출:

9 8 7 6 5 4 3 2 1 0

GCC에서도 작동하기 때문에 이것이 C라고 가정합니다. 이것은 표준에서 어디에 정의되어 있으며 어디에서 왔습니까?



답변

-->연산자가 아닙니다. 그것은 사실 두 개의 분리 된 사업자에, --하고 >.

조건부 코드가 감소 하고 원래 값 (감소하지 않음) x을 반환 x한 다음 원래 값을 연산자 를 0사용하여 비교합니다 >.

이해를 돕기 위해 다음과 같이 진술을 작성할 수 있습니다.

while( (x--) > 0 )

답변

또는 완전히 다른 무언가를 x원한다면 …로 슬라이드합니다 0.

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

수학적으로는 아니지만 모든 그림은 천 단어를 그립니다.


답변

이는 매우 복잡한 연산자이므로 ISO / IEC JTC1 (Joint Technical Committee 1) 조차도 C ++ 표준의 두 부분에 설명을 추가했습니다.

옆으로 농담, 그들은 두 개의 서로 다른 사업자 있습니다 -->§5.2.6 / 2와 C ++ 03 표준의 §5.9에서 각각 설명했다.


답변

그것은 동등하다

while (x-- > 0)

x--(포스트 감소)는 다음과 같습니다 x = x-1. 코드 는 다음과 같이 변환됩니다.

while(x > 0) {
    x = x-1;
    // logic
}
x--;   // The post decrement done when x <= 0

답변

x 반대 방향으로 더 빨리 0으로 갈 수 있습니다.

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

화살표로 속도를 조절할 수 있습니다!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

😉


답변

이것의

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

단지 공간 --만으로도 재미 있고 감소하고 >비교할 수 있습니다.


답변

사용법 -->은 역사적으로 관련이 있습니다. 감소는 x86 아키텍처에서 증가하는 것보다 더 빠르며 (어떤 경우에도 여전히) 빠릅니다. 사용은 -->그 제안 x에가는 0수학적 배경을 가진 사람들에게, 그리고 호소.