2014-07-14 2 views
4
int i=1,j; 
j= ++i + ++i; 
printf("%d",j); 

I는 C 번호 동일한 로직을 사용할 때,이 프로그램의 출력이 C.But에 6이다 출력 5이다.C#과 C에서`j = ++ i ++ i;;의 출력이 다른 이유는 무엇입니까?

나는 같은 논리는 C#에서 규칙은 "엄격 바로 왼쪽 각 표현식을 평가"두 개의 다른 언어

+4

정의되지 않은 동작의 의미는 5입니다. 따라서 출력은 동일합니다. (C에서 _sequence_point_없이'i'를 두 번 변경할 수 없습니다.) – mafso

+1

출력은 * C 컴파일러에서 6 개입니다. 정의되지 않은 동작이므로 다른 답변을 사용할 수 있습니다. – JeremyP

+0

아마 "같은 논리"가 아니기 때문일 수 있습니다. – rightfold

답변

17

에서 다르게 작동하는 이유를 알고 싶어요. 따라서

j= ++i + ++i ; 

잘 C#을에 정의 하지만 두 sequence points 사이에 한 번 이상 변수 자세한 내용을 수정할 수 없기 때문에 같은 표현은 C에 undefined behavior를 호출합니다.

C-FAQ

:

표준은 이전 및 다음 시퀀스 지점 사이

이 객체의 저장 값이 표현의 평가에 의해에서 가장 번 수정 한 것이다 상태. 또한, 종래의 값이 저장되는 값을 결정하는 경우에만 액세스한다)

더 설명 Eric Lippert하여 문서를 읽는다. Precedence vs Associativity vs Order.

+0

증가/감소 연산자가 오른쪽에서 왼쪽으로 평가되지 않습니까? –

+0

표현을 의미합니까? – haccks

+0

예 ... 표현 –