2013-08-29 5 views
-3
int a=9,b=6,c=3; 
printf("%d%d%d"); 

코드 블록 10.05에서 실행했습니다. 나는 쓰레기 값이있어. 그러나 웹 사이트에서 결과는 3 6으로 주어졌습니다. 9. 올바른 것이 무엇입니까?이 문장의 올바른 출력은 무엇입니까?

+5

'printf ("% d % d % d");'인자가 없습니다 - 정의되지 않은 동작입니다. –

+1

정의되지 않은 동작이며 많은 중복이 있습니다. –

답변

3

printf() 호출에 인수를 제공하지 않으므로 가비지 값을 얻게됩니다.

올바른 코드는

printf("%d%d%d",c,b,a); 

+0

그러나 "쓰레기"값은 실제로 a, b 및 c 값일 수 있습니다. 점은 실제로 인쇄되는 것이 정의되지 않는다는 것입니다. 참으로 "3 6 9"일 수도 있지만, 그것은 다른 것일 수도 있습니다. –

+0

True - 엄밀히 말하면 "올바른 출력인지"라는 질문에 대한 대답은 정의되지 않았기 때문입니다. 그러나 OP는 기술적으로 정확하지만 덜 유익한 응답보다는 기대하지 않은 동작을 일으키는 원인을 알고 싶다고 생각했습니다. – ahnlak

+0

@ ErnestFriedman-Hill 로컬 변수는 스택에 저장됩니다. 그래서'printf()'가 호출 될 때, 그것의 타입을 검사하는 스택에서 _variable reference_를 찾는다. 그러나 변수 이름이 제공되지 않으면 ** 형식 지정자 **를 변수 이름과 매핑하지 않고 FIFO 순서로 스택에서 값을 직접 가져옵니다. –

2

올바른 당신이 설명하는 두 가지 중 어느 것도있다 (인용 순서대로 번호를 얻기 위해) 할 것이다. printf에 전달 된 값이 없으므로 해당 시점에 스택에 있던 (포맷되지 않은) 포맷터 만 전달됩니다.

0

이 문장의 올바른 출력은 무엇입니까?

이 코드는 정의되지 않은 동작을 호출하므로 올바른 결과가 없습니다. 출력이 정의되지 않았습니다.

printf에 전달 된 형식 문자열에 사용자가 제공 한 것보다 많은 매개 변수 (3)를 전달해야하므로 코드에서 정의되지 않은 동작을 호출합니다 (0).