수색…


사전 / 증분 / 감소 연산자

C에는 매우 일반적인 혼동의 원천 인 '++'와 '-'라는 단항 연산자가 두 개 있습니다. 연산자 ++증가 연산자 라고하고 연산자 --감소 연산자 라고합니다. 이 두 가지 모두 접두사 형식이나 접미사 형식으로 사용할 수 있습니다. ++ 연산자에 대한 접두사 형식의 구문은 ++operand 이고 postfix 형식의 구문은 operand++ 입니다. 접두사 형식으로 사용되면 피연산자가 먼저 1 씩 증가하고 피연산자의 결과 값이 표현식 평가에 사용됩니다. 다음 예제를 고려하십시오.

int n, x = 5;
n = ++x; /* x is incremented  by 1(x=6), and result is assigned to n(6) */
         /* this is a short form for two statements: */
         /* x = x + 1; */ 
         /* n = x ; */

후위 형식에서 사용되면 표현식에서 피연산자의 현재 값이 사용 된 다음 피연산자의 값이 1 씩 증가합니다. 다음 예제를 고려하십시오.

int n, x = 5;
n = x++; /* value of x(5) is assigned first to n(5), and then x is incremented by 1; x(6) */
         /* this is a short form for two statements: */
         /* n = x; */
         /* x = x + 1; */

감분 연산자의 작업은 -- 유사하게 이해 될 수있다.

다음 코드는 각 코드가 수행하는 작업을 보여줍니다.

    int main()
    {
        int a, b, x = 42;
        a = ++x; /* a and x are 43 */
        b = x++; /* b is 43, x is 44 */
        a = x--; /* a is is 44, x is 43 */
        b = --x; /* b and x are 42 */
        
        return 0;
    }

위의 결과에서 포스트 연산자는 변수의 현재 값을 반환 한 다음 수정하지만, 사전 연산자는 변수를 수정 한 다음 수정 된 값 반환합니다.

C의 모든 버전에서 사전 및 사후 연산자의 평가 순서는 정의되지 않았으므로 다음 코드는 예기치 않은 결과를 반환 할 수 있습니다.

    int main()
    {
        int a, x = 42;
        a = x++ + x; /* wrong */
        a = x + x; /* right */
        ++x;

        int ar[10];
        x = 0;
        ar[x] = x++; /* wrong */
        ar[x++] = x; /* wrong */
        ar[x] = x; /* right */
        ++x;
        return 0;
    }

성명에서 단독으로 사용되는 경우 선행 후 작업자를 사용하는 것이 좋습니다. 위의 코드를보십시오.

또한 함수가 호출 될 때 함수가 실행되기 전에 인수에 대한 모든 부작용이 발생해야합니다.

    int foo(int x)
    {
        return x;
    }

    int main()
    {
        int a = 42;
        int b = foo(a++);  /* This returns 43, even if it seems like it should return 42 */
        return 0;
    }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow