문제

x = 1;
std::cout << ((++x)+(++x)+(++x));

나는 출력이 될 것으로 기대한다 11, 그러나 실제로는입니다 12. 왜요?

도움이 되었습니까?

해결책

우리는 기대함으로써 그것을 설명합니다 정의되지 않은 행동 특정 결과보다는. 표현이 개입하지 않고 X를 여러 번 수정하려고 시도함에 따라 시퀀스 포인트 그것의 행동은 정의되지 않습니다.

다른 팁

다른 사람들이 말했듯이 C 및 C ++ 표준은 이것이 생성 할 동작을 정의하지 않습니다.

그러나 표준이 왜 그런 일을하는지 알지 못하는 사람들에게는 "실제 세계"예를 살펴 보겠습니다.

1 * 2 + 3 + 4 * 5

계산에는 아무런 문제가 없습니다 1 * 2 + 3 계산하기 전에 4*5. 곱셈이 추가보다 우선 순위가 높다고해서 우리가 수행해야한다는 의미는 아닙니다. 모두 추가하기 전에 표현의 곱셈. 실제로 계산을 수행 할 수있는 여러 가지 주문이 있습니다.

평가에 부작용이있는 경우 다른 평가 순서가 결과에 영향을 줄 수 있습니다. 표준이 동작을 정의하지 않으면 그것에 의존하지 마십시오.

이것은 실제로 정의되지 않았습니다. C ++는 명령문 실행 순서를 명시 적으로 정의하지 않으므로 컴파일러에 따라 달라 지며이 구문을 사용해서는 안됩니다.

코드 스 니펫이 호출됩니다 정의되지 않은 행동 두 C/C ++에서. 시퀀스 지점에 대해 읽으십시오. 여기.

제 생각에는

cout<<((++x)+(++x)+(++x));

컴파일러 첫 번째 실행 Prefix ++ x 따라서 x의 값이됩니다.

x = 2


이제 ++ x에 의해 X가 될 것입니다

x = 3


++ x 이후

x = 4


이제 x의 값을 추가 할 시간입니다

x+x+x = 4+4+4

x+x+x = 12

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top