이것은 C 및 C ++의 lvalue 및 rvalue와 관련이 있습니다.
C 프로그래밍 언어에서 사전 증분 및 사후 증분 연산자는 모두 lvalue가 아니라 rvalue를 반환합니다. 이는 =
할당 연산자 의 왼쪽에있을 수 없음을 의미합니다 . 이 두 명령문 모두 C에서 컴파일러 오류를 발생시킵니다.
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
그러나 C ++에서 증분 사전 연산자는 lvalue를 리턴 하고 사후 증분 연산자는 rvalue를 리턴합니다. 사전 증가 연산자가있는 표현식을 =
대입 연산자 의 왼쪽에 배치 할 수 있음을 의미합니다 !
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
왜 이럴까요? 후행 증가는 변수를 증가시키고 이전 과 같이 변수를 반환합니다. 증가시키고 증가가 발생 . 이것은 실제로 rvalue 일뿐입니다. 변수 a의 이전 값은 임시로 레지스터에 복사 된 다음 a가 증가합니다. 그러나 이전의 a 값은 표현식에 의해 리턴되며 rvalue입니다. 더 이상 변수의 현재 내용을 나타내지 않습니다.
사전 증분은 먼저 변수를 증분 한 다음 증분이 발생한 후 변수를 반환합니다 . 이 경우 변수의 이전 값을 임시 레지스터에 저장할 필요가 없습니다. 변수가 증가한 후에 변수의 새 값을 검색합니다. 따라서 사전 증분은 lvalue를 반환하고 변수 자체를 반환합니다. 우리는이 lvalue를 다른 것에 할당 할 수 있습니다. 다음 문장과 같습니다. 이것은 lvalue를 rvalue로 암시 적으로 변환 한 것입니다.
int x = a;
int x = ++a;
사전 증분은 lvalue를 반환하기 때문에 무언가를 할당 할 수도 있습니다. 다음 두 문장은 동일합니다. 두 번째 할당에서는 먼저 a가 증가한 다음 새 값이 2로 덮어 씁니다.
int a;
a = 2;
++a = 2; // Valid in C++.