2013-05-09 2 views
1
int a=5; 
++a=a; 

위의 코드 세그먼트를 찾으십시오. 이 코드는 C++ (g ++) 컴파일러에서는 문제가 없지만 c (gcc) 컴파일러에서는 오류가 발생합니다. 이 이유를 알 수 있습니까? c 컴파일러의 오류는 "할당의 왼쪽 피연산자로 왼쪽 값이 필요합니다"입니다.C 컴파일러에서 오류가 있지만 C++ 컴파일러에서 오류가 발생했습니다.

+0

C++에서 A는 값이 아닌 변수를 참조하지 않도록에 대한 C++ – bikram990

+0

관련 : http://stackoverflow.com/questions/3690141/multiple-preincrement -opera-on-a-cc에서 가변 –

답변

1

왜냐하면 C++에서 사전 증가 연산자는 lvalue를 산출하는 반면 C에서는 rvalue입니다.

+0

표준 증명? – MOHAMED

+0

"C++에서 미리 증가 연산자는 lvalue를 산출하지만 C에서는 rvalue입니다."왜 그렇게입니까? – akhil

+2

@akhil 두 언어가 다르기 때문에. (이는 단지 설계상의 질문 일 뿐이며 C++ 표준위원회는 C와는 다른 결정을 내렸다.) –

2

C++에서 연산자 오버로드가 발생합니다 (사전 확장도 오버로드 할 수 있음). 따라서 사전 추가 연산자가 C++에서 lvalue를 반환합니다. 예를 들어

:

일부 포인터 기능을 구현할 수 있고,해야 할 수도 클래스 :

  • 포인터 이동에 대한 선행 증가;
  • 포인터 값 (주소 별 값)에 대입하는 대입 연산자입니다.

이 경우 사전 증가가 유용 할 수 있습니다.

추상 코드 예제 :

class MyIntPtr { 
    int *val; 
    ... 
public: 
    MyIntPtr(int *p) { ... }; 
    MyIntPtr &operator++() { ++val; return *this; }; 
    void operator=(int i) { *val = i; } 
    ... 
}; 

... 

int array[10]; 
MyIntPtr ptr(array); 

for(int i = 0; i < sizeof array; ++i) 
    ++ptr = i; 
관련 문제