source

C와 C++에서 +=의 결과는 무엇입니까?

topadmin 2022. 12. 3. 12:51

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)+=10C++에서는 정의되어 있지 않지만 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