2016-08-09 6 views
0

는 다음 코드를 고려? 나는 컴파일러가 함수의 결과를 계산하고, 그 다음에 p + n을 증가 시키거나 컴파일러가 특정 일 것이라고 추측하겠습니까?lvalue 및 함수 결과 - 종속성?</p> <pre><code>int func(char *ptr); ... n += func(p + n); </code></pre> <p>함수의 인수 이후이 코드 수율 정의되지 않은 동작은, 좌변에 따라 달라집니다 않습니다

+0

@EugeneSh .: 참조를 추가하면 답변이됩니다. –

답변

2

함수 호출 전에 함수가 입력되기 전에 시퀀스 포인트가 있습니다. 이는 모든 값 계산 및 인수와 관련된 부작용이 함수 호출에 함수가 입력되기 전에 완료됨을 의미합니다.

10-C11 §6.5.2.2/:

함수 지정자의 평가와 실제 인수 후 그러나 실제 통화 전에 시퀀스 점이있다.

그래서

n += func(p + n); 

p + n 경우 함수 호출하기 전에 계산된다.

+0

* "함수가 입력되기 전에 인수에 대한 모든 부작용이 완료되었습니다."* 문구가 잘못 나온 것 같습니다. 여기에 어떻게 적용됩니까? 여기에 어떤 부작용이 있습니까? 'n'의 증가? 하지만 전화하기 전에는 일어나지 않습니다. 'p + n'은'n '의 * previous * 값으로 계산됩니다. –

+0

@EugeneSh .; 사실 그것은 약간의 정보가 부족한 것 같습니다. 이 경우'p + n'의 값 계산. OP는 말합니다 : * 컴파일러가 함수의 결과를 계산 한 다음'p + n' *을 증가시키는 것으로 가정합니다. 그러나 그 반대가 사실입니다. 'p + n'이 먼저 계산되고 함수는 그 결과를 반환 할 것입니다. – haccks

+0

@EugeneSh .; * 표현식 A와 B의 평가 사이의 시퀀스 포인트 의 존재는 모든 값 계산 및 부작용이 발생하기 전에 모든 값 계산 및 부작용 **이 시퀀스와 연관되어 있음을 의미합니다. 은 B와 관련됩니다. . * 부작용뿐만 아니라 abot 값 계산도 마찬가지입니다. 이 경우 나는 인수와 관련된 부작용이 없기 때문에'p + n'의 값 계산에 대해 이야기하고 있습니다. – haccks

0
n += func(p + n); 

은 함수 호출이 완료된 후에 만 ​​쓰기를 위해 n이 액세스되기 때문에 잘 정의되어 있습니다. 함수 호출은 n 값을 읽은 후에 만 ​​완료 될 수 있습니다.

+0

시퀀스 포인트와 관련해서는 어떻게 설명 할 수 있습니까? 그들이 그렇지 않은 것처럼 보입니다. 여기에는 부작용이 없습니다. –

+0

@EugeneSh. 함수 호출이 인수의 평가에만 적용되는 시퀀스 포인트를 포함한다고해도 'n + = func (p + n);이 제대로 작동하는지 여부를 결정하는 것과 관련이 없다고 생각합니다. 한정된. –