2013-07-10 4 views
4

지난 며칠 동안 나는 undefined behavior에 대해 학습하려고했습니다. 며칠 전 c-faq 링크를 발견했습니다. 이것은 많은 혼동을 해소하는데 많은 도움이되지만, 질문이 #3.8 일 때 큰 혼란을 일으 킵니다. 성명서 (특별히 두 번째 문장)를 이해하기위한 노력을 많이 한 후에;정의되지 않은 동작 및 시퀀스 포인트

이 표준은 이전 및 다음 sequence point 사이

이 객체의 저장 값이 표현식의 평가에 의해에서 가장 번 수정 한 것이다 상태. 또한, 이전 값은 저장 될 값을 결정하기 위해서만 액세스되어야한다.

나는 SO에 question을 물어 더 나은 생각하지만 대답은 아무도 거기에이 문장의 두 번째 문장을 설명합니다. 마지막으로, 나는이 점에 대해 explanation을 이미 가지고있다. 그것을 읽고 많은 시간을 나는 그 결론을 내렸다;

1. 마지막 문장

또한, 종래 값들은 다음과 같이 될 것이다

저장되는 값을 결정하는 경우에만 액세스한다;

또한, 오브젝트의 이전 값은 수정/신규 값 (동일한 객체의) 저장할 수를 결정하는 데에만 액세스한다. (RHS)에 i의 (여기 1이다)

는 예에 의해 명백 하듯이 식의 경우

int i = 1, j, a[5];  
i = i + 1; 
j = i + 1; 
a[i] = i; 

i = i + 1 이전 값으로 i의 값을 결정하기 위해 액세스 저장된. j = i + 1a[i] = i 경우, I의 값은 액세스 동안 단지 i 이러한 문장 변형되는 경우없이 같은하지종래 값. 표현 a[i] = i++ 또는 a[i++] = i

2.In 경우, 개체가 그 저장된 값이 평가에 의해에서 가장 번 수정 한 것이다 위의 진술 이전 및 다음 시퀀스 지점 사이

의 첫 문장 표현.두 개의 연속적인 순서 포인트 사이에 한 번만 수정입니다 i으로

실패 얻을. 그래서 우리는 두 번째 문장이 필요한 것입니다. 발현
i의 이전 값은 두 배, 즉 액세스 때문에 이들 예는 모두 C에 허용된다 i++ 자체 액세스 i의 이전 값i의는 IT 및 이전 값/값의 따라서 다른 접속을 수정할 저장 될 수정 된 값을 결정하기 위해 액세스되지 않으므로 불필요합니다.

문제는 내가 그것을

사실 C-자주 묻는 질문에 명시되어있는 대한 표현 i = i++ 함께 왔을 때, 우리가 논의했던 다른 표현으로, 두 번째 문장의 위반 시작 잘.

나는 i의 수정 된 값을 결정하기 위해 액세스 할 수 있습니다 (R.H.S에서)이 표현 i 생각.
이 표현식이 두 번째 구문을 어떻게 위반합니까?

답변

3

그것에 대해 이런 식으로 생각은 :

a = i; 
i++; 

(가) 증가에 i의 값을 액세스하는가 저장 될 어떤 값을 결정과 아무 상관이 :

a = i++; 

에 해당합니다 에. 따라서 i = i++에는 i (첫 번째 문장에서 허용되지 않음)의 두 가지 수정 사항이 포함되어 있지만 i에 대한 i = 수정은 i에 대한 액세스 중 하나와 독립적입니다. i++에 있습니다.

누군가가 더 영리하다고 생각합니다. 정의되지 않은 동작이 정의되지 않은 정도를 파악할 필요가 없습니다. 값을 두 번 수정하면 충분하지 않습니다.

+0

R.H.S에서'i' 번까지 몇 번이나 액세스 했습니까? – haccks

+0

글쎄, 전체적인 표현식이 정의되지 않았기 때문에, 얼마나 많은 시간을 액세스했는지에 대해서는 정의가 없습니다. – Art