2017-05-11 5 views
1

나는 다음과 같은 코드가 C에서 정의되지 않은 동작을 생산하는 것으로 알려져 있습니다 이해/C++C#/Java에서 접미사 자체 할당 동작이 엄격하게 정의 되었습니까?

int i = 1; 
    i = 2*i++; 
    cout << i << endl; // surprisingly 3, undefined... 

그것은 자바/C#에서 2의 예상 결과를 생성합니다. 하지만 이것은 Java/C# 또는 여전히 정의되지 않은 동작에서 보장됩니까?

+0

null을 편집하는 이유는 무엇입니까? 이것은 지금 공통된 일입니까? –

+0

글쎄, 그는 [C++] 태그를 삭제하고, 나중에 그가 틀렸다고 깨달았습니다. – Ivar

+0

결과가 잘 정의되었다고해도 왜 그런 코드를 작성하고 싶습니까? –

답변

1

C#에서는 매우 잘 정의되어 있습니다.

  1. 변수를 증가시킵니다.
  2. 그것은 변수

에 이전 값을 할당 그래서 변수의 값은 변경되지 않습니다. 여기에 사건이 발생한 결과는 2입니다.

i = i++ 

이것은 복합 문의 일환으로 올 때

t = i 
    i = i + 1 
    i = t 

으로 표현 이런 종류의 매우 혼란 스러울 것 같다. 표현을 간단하게 유지하고 장기적으로 자신과 다른 사람들에게 혼란을주지 않는 것이 좋습니다.

자바와 C에서 표현식이 왼쪽에서 오른쪽으로 평가됩니다.

+0

감사합니다. 그러나 이것이 내가 C++에서도 작동 할 것이라고 기대했던 방식입니다. C#에서 수정 후 자체 할당의 유효성에 대한 특정 문서에 대한 링크? –

+0

'= '은 (는) C#에서 우선 순위가 낮습니다. https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/operators/increment-operator says'두 번째 형식은 후위 증가 연산입니다. 연산 결과는 증가하기 전의 피연산자 값입니다. ' –

+0

응답 해 주셔서 감사합니다. 노력에 감사드립니다. 참고로, C++에서도 마찬가지입니다. 그러나 시퀀싱 규칙 때문에 정의되지 않은 상태가됩니다. C++에만 적용되는지 궁금해했습니다. –