C와 C++에서 +=의 결과는 무엇입니까?
내 코드는 다음과 같습니다.
#include <stdio.h>
int main(int argc, char **argv) {
int i = 0;
(i+=10)+=10;
printf("i = %d\n", i);
return 0;
}
gcc를 사용하여 C 소스로 컴파일하려고 하면 다음 오류가 발생합니다.
error: lvalue required as left operand of assignment
그러나 g++를 사용하여 C++ 소스로 컴파일하면 오류가 발생하지 않으며 실행 파일을 실행할 때 다음과 같이 됩니다.
i = 20
왜 다른 행동일까요?
복합 할당 연산자의 의미는 C와 C++에서 다릅니다.
C99 표준, 6.5.16, 파트 3:
할당 연산자는 왼쪽 오퍼랜드에 의해 지정된 객체에 값을 기억한다.할당식은 할당 후 왼쪽 피연산자 값을 가지지만 l 값은 아닙니다.
C++ 5.17.1의 경우:
할당 연산자(=)와 복합 할당 연산자는 모두 오른쪽에서 왼쪽으로 그룹화합니다.모두 왼쪽 피연산자로 수정 가능한 l값을 요구하고 할당이 이루어진 후 왼쪽 피연산자의 유형과 값과 함께 l값을 반환합니다.
EDIT : 동작(i+=10)+=10
C++에서는 정의되어 있지 않지만 C++11에서는 정의되어 있습니다.표준의 관련 부분에 대해서는, NPE 의 질문에 대한 이 회답을 참조해 주세요.
C코드가 무효일 뿐만 아니라 회선도
(i+=10)+=10;
C 와 C++03 의 양쪽 모두에서 정의되지 않은 동작이 발생하게 됩니다.이는 C 가 C++03 을 수정하기 때문입니다.i
시퀀스 포인트 사이에 두 번.
C++로 컴파일이 허가된 이유에 대해:
[C++N3242 5.17.1] 할당 연산자(=)와 복합 할당 연산자는 모두 오른쪽에서 왼쪽으로 그룹화 됩니다.모두 왼쪽 피연산자로 수정 가능한 l값이 필요하며 왼쪽 피연산자를 참조하는 l값을 반환합니다.
같은 단락에서 라고 말하고 있다
모든 경우, 할당은 좌우 피연산자의 값 계산 후 및 할당식의 값 계산 전에 시퀀싱된다.
이는 C++11에서 표현식에 정의되지 않은 동작이 없음을 나타냅니다.
언급URL : https://stackoverflow.com/questions/10653903/whats-the-result-of-in-c-and-c
'source' 카테고리의 다른 글
MariaDb가 인스턴트 알고리즘을 사용하여 큰 테이블에 열을 추가하지 않는 이유는 무엇입니까? (0) | 2022.12.03 |
---|---|
GROUP BY 조회가 있는 행 수 가져오기 (0) | 2022.12.03 |
파일에 바이트를 쓰는 방법 (0) | 2022.12.03 |
PHP의 다차원 배열에서 키=> 값으로 검색하는 방법 (0) | 2022.12.03 |
HTML에서 부울 Vue 프로펠러 값 전달 (0) | 2022.12.03 |