2011-04-10 1 views
3
int j=5,k=9; 
printf("%d...%d"); 

이 질문은 책에 있습니다. 주어진 출력 : 5 9 그러나 내가 이것을 시도 : 쓰레기 값, 내게 이것을 설명하십시오. 책에 설명은 printf와이 프로그램의 처음 두 과제의 값을 사용합니다 말한다이 printf 문으로 인해 책 예제에 표시된 출력이 생성되지 않는 이유는 무엇입니까?

+5

당신에게 그것을 가르쳐 준 책은 어느 것입니까? – icktoofay

+5

책이 쓰이지 않았습니까?'printf ("% d % d \ n", j, k);'? 만약 당신이 쓴 것을 정확히 써 주었다면, 그 책을 읽지 말고 (더 좋은 C 책을 구하십시오.) http://en.wikipedia.org/wiki/The_C_Programming_Language_ (book). – sarnold

+0

네, 똑같은 책이 위에 쓰여 있습니다. – John

답변

0

시도 :

int j=5,k=9; 
printf("%d %d", j, k); 
+0

나는 위의 답변을 인쇄합니다 알아요.하지만 그건 사실이 아니야. – John

+5

그럴 경우 큰 돌, 로프 조각을 가져 와서 돌을 책에 묶어서 아주 깊은 호수에 던지십시오.) – Lindydancer

1

이 다른 책의 printf를 선택 ("% d 개 ... % D"); 어떤 의미가 없습니다. 형식 문자열에서 % d을 (를) 대체하기 위해 두 개의 정수 인수를 제공해야합니다. 당신이

int j=5,k=9; 
printf("%d...%d", j, k); 

를 작성하는 경우

3

첫째, 당신은 이제 5 9

얻을 것이다, printf 가변 인자를 얻을 수있는 기능이며, 그것은 항상있는 문자열을 구문 분석 첫 번째 인수와 주어진 인수에서 값을 넣을 위치를 결정합니다. 즉, 함수에 주어진 인수와 관련하여 컴파일러가 강제하지 않으므로 오류가 발생하지 않습니다.

printf보다 함수 호출시 인수가 스택에 푸시 된 경우 %d이 표시되고 스택에 다음 int를 숫자 (등등)로 표시합니다. 스택에있는 데이터는 함수 호출과 관련이 없습니다 (관련되어 있지만 원하는 것은 아닙니다).

+2

그리고 이것이 작동 할 수있는 건축에서도, optimizer는 참조되지 않는 지역 변수를 할당하고 초기화 할만큼 스택하기에 충분히 어리 석다. – RBerteig

10

도서 작성자는 바보 같은 행동에 의존합니다 . (이 undefined 또는 implementation defined 또는 just plain stupid 경우 나도 몰라.) 그들은 printf(3)가 호출 될 때 거기 마술 당신의 스택 할당 jk 변수에 의존

. printf(3)인수-printf(3), 등으로, 개체를 읽을 수있는 얼마나 많은 유형 , 그것은 마술 스택에있는 jk 변수를 해석하는 것입니다 결정하기 위해 형식 문자열를 사용하기 때문에 그들이 의도적으로 전달 되었다면.

이것은 "모든 장면에서 어떻게 작동하는지"의 마법에 너무 많이 의존합니다. 이 코드 블록이 "이 코드는 사용자에게 표시 될 수 있습니다 ..."및 "이 바보 같은 일을하지 마십시오 ..."로 둘러싸여 있지 않으면이 책은 더 이상 읽을 가치가 없을 것입니다.

+1

+1 @sarnold 나는 어리 석음을 선택한다. 이 가정은 사실이 아닐 것입니다! – MByD

+0

+1이 책의 예제가 무엇이 잘못되었는지 명확하게 설명했기 때문에 "책이 어리 석다"는이 버전이 마음에 듭니다. 개인적으로, 나는이 코드를 '그냥 평범한 바보'라고 부를 것이다. 코드 생성기, 최적화 도구 부족 및 호출 규칙에 따라 바보입니다. – RBerteig

+0

+1 "설득력 있고 우아한"책 만들기. 이것이 가치있는 일이라면, 이것은 UB (일치하는 인수 번호와 타입을'printf'에 전달하지 못한 것)입니다. –

관련 문제