2014-10-15 2 views
-1

오늘 전 증가 및 사후 증가를 재검토했습니다.사전 증가 및 사후 증가

기본 정의 내가 아는 바.

사전 증가 - 값을 증가시키고 값을 반환합니다.

게시물 증가 - 값을 증가시키고 증가하기 전에 값을 리턴합니다.

하지만 그 중 일부 조합을하는 것은 난처한 상황입니다.

기본 C 프로그램을 사용하여 테스트 한 내용은 다음과 같습니다.

처음에는 i = 0입니다.

1 차 시험

printf("%d %d",++i,++i); 

OUPUT :

2 2 

내가 예상 :

1 2 

2 차 시험

,451,515,
printf("%d %d",i++,i++); 

OUPUT :

1 0 

내가 예상 :

0 1 

3 테스트

printf("%d %d",i++,++i); 

OUPUT :

1 2 

내가 예상 :

0 2 

4 테스트

printf("%d %d",++i,i++); 

OUPUT :

2 0 

내가 예상에게 :

1 1 

오른쪽 또는 왼쪽에서 평가 한 것 같습니다. Pre Increment &의 경우 왼쪽에서부터 증가 할 수 있습니다. 어쩌면 사전 증가가 포스트 증가보다 우선 순위가 높을 수도 있습니다. 결과와 일치하는 아이디어가 있지만 한 테스트에서 가정 한 결과는 다른 결과를 설명하지 못합니다.

+3

정의되지 않은 동작입니다. – chris

+1

C와 관련하여 [이 구성 요소는 왜 정의되지 않은 동작입니까?] (http://stackoverflow.com/q/949433/1708801) 및 [printf ("% d % d", C++, c)의 출력입니까? 또한 정의되지 않았습니까?] (http://stackoverflow.com/q/10845122/1708801) –

+0

'int before = i ++; printf ("% d % d \ n", 앞에, i);'는 정의되지 않은 동작을 제거합니다. – 5gon12eder

답변

6

동일한 시퀀스 포인트 쌍 사이에서 동일한 변수를 여러 번 수정하므로 미정의 동작입니다.예를 들어

i = i++; 

도 정의되지 않았습니다. 더 깊은 토론 here가 있고,이 "더 깊은"단점을 다루는 멋진 slideshare가 있습니다.

다른 문제는 평가 순서입니다. 인수는 지정되지 않은 순서대로 평가됩니다, 그래서 당신은

f(a(), b(), c()); 

이있는 경우는 임의의 순서로 a, bc 호출 할 수 있습니다.

정의되지 않은 동작과 명시되지 않은 동작이 혼합되어 있으므로 출력 결과를 얻는 이유를 추측 할 수는 있지만 임의적이므로 만족스러운 설명을하기는 어렵습니다.

+0

나는 그것이 정의되지 않은 행동이라는 것을 알지 못했다. 하지만 대학에서 나는 int b = i ++ + ++ i 등등과 같은 많은 문제에 직면 해 왔습니다. 그래서이 질문들은 유효한 질문이 아닙니다. –

+0

@ShauryaChaudhuri 사실, 그들은 (자바에서는 평가 순서가 엄격하게 정의 된) 유효한 질문이 아닙니다 ... 그들이 정의되지 않았다는 것을 설명하는 코스 테스트에서 후속 테스트 질문이 아니면. –

+0

@ShauryaChaudhuri 나는 "b의 가능한 값은 무엇입니까?"라고 말한 것과 같은 테스트에서 질문을 보았습니다. 또는 이와 비슷한 대답은 그것이 무엇이든 될 수 있다는 것입니다. 프로그램이 충돌 할 수 있습니다. 컴퓨터가 화재를 일으킬 수 있습니다. 그러나 많은 교수들이 그런 낮은 수준의 세부 사항에 대해 걱정하지 않으므로 자신이 옳았다는 것을 보여주고 싶다면 C 표준을 철회 할 준비를하십시오. –

관련 문제