지난 며칠 동안 나는 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 + 1
와 a[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
생각.
이 표현식이 두 번째 구문을 어떻게 위반합니까?
R.H.S에서'i' 번까지 몇 번이나 액세스 했습니까? – haccks
글쎄, 전체적인 표현식이 정의되지 않았기 때문에, 얼마나 많은 시간을 액세스했는지에 대해서는 정의가 없습니다. – Art