c++ 의미 - C ++에서 "->"연산자는 무엇입니까?





단항연산자 비트연산 (19)


기존의 방법으로 while 루프 괄호 " () "에서 조건을 정의하고 중괄호 " {} "안에서 조건을 종료하지만,이 -- & > 는 한꺼번에 모든 것을 정의하는 방법입니다. 예 :

int abc(){
    int a = 5
    while((a--) > 0){ // Decrement and comparison both at once
        // Code
    }
}

시간이 a 보다 커질 때까지 a 감소시키고 루프를 실행합니다.

다른 방법은 다음과 같아야합니다.

int abc(){
    int a = 5
    while(a > 0){
        // Code
        a = a -1 // Decrement inside loop
    }
}

두 가지면에서 우리는 똑같은 일을하고 같은 목표를 성취합니다.

comp.lang.c++.moderated 에서 숨겨진 기능 및 C ++ / STL의 숨겨진 기능을 읽은 후 Visual Studio 2008과 G ++ 4.4 모두에서 컴파일되고 작동되는 것에 대해 매우 놀랐습니다.

코드는 다음과 같습니다.

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

나는 이것이 GCC에서도 잘 작동하기 때문에 이것이 C라고 가정 할 것이다. 표준에서 정의 된 부분은 어디에서 비롯 되었습니까?




--> 사이에 공백이 있습니다. x 는 후행 감소, 즉 x>0 ? 조건을 확인한 후에 감소합니다 x>0 ? .




완전히 괴짜지만, 나는 이것을 사용할 것이다 :

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}



또는 완전히 다른 무언가를 위해 ... x slide to 0

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

그렇게 수학적은 아니지만 ... 모든 그림이 천 단어를 칠합니다 ...




왜 모든 합병증?

원래 질문에 대한 간단한 대답은 다음과 같습니다.

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

똑같은 일을한다. 당신이 이렇게해야한다고 말하는 것은 아니지만, 똑같은 일을하고 한 게시물에 질문에 대답했을 것입니다.

x-- 는 위의 경우에 단지 축약 형이며, > 는 정상적인보다 큰 operator 입니다. 아니 큰 수수께끼!

요즘에는 복잡한 일을 너무 많이하는 사람들이 있습니다.)




내가 읽은 한 권의 책 (나는 어떤 책을 정확하게 기억하지 못한다.) : 컴파일러 는 왼쪽 오른쪽 규칙을 사용하여 가장 큰 토큰대한 식을 구문 분석하려고 시도했다 .

이 경우 표현식은 다음과 같습니다.

x-->0

가장 큰 토큰을 파싱합니다.

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

이 표현식에도 같은 규칙이 적용됩니다.

a-----b

구문 분석 후 :

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

이것이 복잡한 표현을 이해하는 데 도움이되기를 바랍니다 ^^




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

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

       printf("%d ", x);
     }

     return 0;
}

공간 만 있으면 재미있는 것처럼 보입니다. -- 감소하고 비교합니다.




--감소 연산자이고 >더 큰 연산자입니다.

두 연산자는 --> 와 같은 단일 연산자로 적용됩니다.




어쨌든, 이제 우리는 "간다"연산자를 사용합니다. "-->" 는 방향으로 기억하기 쉽고 "x가 0으로가는 동안"은 의미 직설법입니다.

또한 일부 플랫폼에서는 "for (x = 10; x > 0; x --)" 보다 약간 더 효율적입니다.




CC++ 은 "최대 뭉크 (max munch)"규칙을 따른다. a - b가 (a--) - b b로 변환되는 것과 같은 방식으로, x-->0(x--)>0 변환됩니다.

규칙이 본질적으로 말하는 것은 왼쪽에서 오른쪽으로가는 것입니다. 표현은 유효한 표현을 형성 할 수있는 최대의 문자를 취함으로써 형성됩니다.




이 코드를 실행할 때 내 컴파일러가 9876543210을 출력합니다.

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

예상대로. while( x > 0) 은 실제로 while( x > 0) 합니다. x-- 게시물은 x 감소시킵니다.

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

같은 것을 쓰는 다른 방법입니다.

하지만 원본이 "x가 0으로가는 동안"과 같이 보이는 것이 좋습니다.




그것은 두 가지 연산자의 조합입니다. 첫 번째는 값을 감소시키기위한 것이고, > 는 값이 오른쪽 피연산자보다 큰지 확인하기위한 것입니다.

#include<stdio.h>

int main()
{
    int x = 10;

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

    return 0;
}

출력은 다음과 같습니다.

9 8 7 6 5 4 3 2 1 0            



이 코드는 먼저 x와 0을 비교 한 다음 x를 감소시킵니다. (또한 첫 번째 대답에서 : 당신은 x를 post-decrementing하고 x와 0을 > 연산자로 비교할 것입니다.)이 코드의 출력을보십시오 :

9 8 7 6 5 4 3 2 1 0

이제는 출력에서 ​​0을 보면서 비교하고 감소시킵니다.

먼저 감소시키고 비교하려면 다음 코드를 사용하십시오.

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

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

출력은 다음과 같습니다.

9 8 7 6 5 4 3 2 1



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

;)




그것은

while (x-- > 0)

x-- (후 감소)는 x = x-1 과 동일하므로 코드는 다음으로 변환됩니다.

while(x > 0) {
    x = x-1;
    // logic
}



사실, x 는 post-decrementing이고 그 조건은 검사되고 있습니다. 그것은 아닙니다 --> , (x --> (x--) > 0

참고 : x 값은 조건을 확인한 후에 사후 감소하기 때문에 변경됩니다. 유사한 경우도 발생할 수 있습니다. 예를 들면 다음과 같습니다.

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0



이것은

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

음수가 아닌 숫자의 경우




이것은 매우 복잡한 연산자이므로 ISO / IEC JTC1 (공동 기술위원회 1) 조차도 C ++ 표준의 두 가지 다른 부분에 설명을 추가했습니다.

농담은 제쳐두고, 그들은 두 개의 서로 다른 연산자입니다 : -- > C ++ 03 표준의 §5.2.6 / 2 및 §5.9에 각각 설명되어 있습니다.




Java 구현에서는, 이동하는 비트 수는 소스의 사이즈에 의해 mod'd입니다.

예 :

(long) 4 >> 65

2를 맞 춥니 다. 비트를 오른쪽으로 65 번 이동하면 모든 것이 0이되지만, 실제로는 다음과 같습니다.

(long) 4 >> (65 % 64)

<<, >> 및 >>>의 경우에도 마찬가지입니다. 나는 다른 언어로 그것을 시도하지 않았다.





c++ operators code-formatting standards-compliance