2013-02-04 2 views
2

가능한 중복 :
Undefined Behavior and Sequence PointsC/C++ 사후 증가/-decrement 및 함수를 호출

나는의 Microsoft Visual C를 사용하고 ++. 다음 예를 살펴 보겠습니다 :

int n = 5; 
char *str = new char[32]; 
strcpy(str, "hello world"); 
memcpy(&str[n], &str[n+1], 6+n--); 
printf(str); 
// output is "hell world" 

것은 그래서 unexpectadly 내 컴파일러는 다음 처음 감소시키고 N 및 방어 적이기을 실행하는 코드를 생성합니다. 다음 소스는 내가 기대했던 것을 할 것입니다 :

int n = 5; 
char *str = new char[32]; 
strcpy(str, "hello world"); 
memcpy(&str[n], &str[n+1], 6+n); 
n--; 
printf(str); 
// output is "helloworld" 

처음에 나는 그것을 직접 설명하려고 노력했습니다. 마지막 매개 변수는 먼저 스택에 푸시되고, 먼저 평가 될 수 있습니다. 하지만 실제로 포스트 증가/감소가 다음 세미콜론 다음에 평가된다는 보장이 있다고 생각합니다.

void foo(int first, int second) { 
    printf("first: %i/second: %i", first, second); 
} 
int n = 10; 
foo(n, n--); 

이 의지 출력 "첫째 : 10/초 : 10"

그래서 나는 다음과 같은 테스트를 실행했습니다.

내 질문은 :이 상황에 정의 된 동작이 있습니까? 누군가가 이것이 설명 된 문서를 가리킬 수 있습니까? 컴파일러 버그를 찾았습니까 ~~ O.O ~~?

이 예제는 더 이상 의미가 없도록 단순화되었으며, 단지 문제를 보여 주며 그 자체로 작동합니다.

+0

정의 된 동작 => no – ipc

+0

@ipc : 매번 저를 혼란스럽게합니다. 왜 "지정되지 않은"동작이 아닌 "정의되지 않은"동작입니까? 불특정 다수의 주장에 대한 평가의 순서 만이 아닌가? –

+0

http://parackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in-c – chris

답변

7

관련 문제가 두 가지 있습니다. 첫째, 함수 인수의 실행 순서는 이고 지정되지 않은입니다. 함수의 본문에 들어가기 전에 모든 것이 실행된다는 것이 보장됩니다. 둘째로 이 정의되어 있지 않습니다. 이러한 표현 사이에 시퀀스 포인트없이 n을 변경하고 읽으므로.

+0

고맙습니다. 나는 논쟁에 대한 실행의 불특정 순서에 대해 알았지 만, 이것이 우체국 운영자들에게 영향을 미쳤다. 나는 그들이 다음 세미콜론 후에 항상 처형 될 것이라고 생각했다. – typ1232