2014-02-12 3 views
3

SNS 사진 앨범에서 "내가 가장 만난 결과물"이라는 제목으로이 두 문장을 발견했습니다. 그들이 일하는이상한 printf와 puts 설명문이

printf("%d%c", a, " \n"[i==n]); 
puts("YES\0No"+condition * 4); 

나는 그들이 무엇을하고 있는지 아무 생각도 없어 방법 : 여기

는 두 문장이다. 누군가 나에게 설명해 줄거야? 고맙습니다.

+1

"* elegant *"이 보이지 않지만 난처한 코드 일뿐입니다. – alk

+0

@alk 나는 그것을 설명하는 방법을 모른다. 그래서 나는 '우아한'이라는 단어를 골랐다. – laike9m

+0

나는 실제로 당신의 질문의 제목을 언급하지 않았지만 당신이 인용 한 제목에 : "내가 만난 출력의 가장 우아한 방법 *" – alk

답변

6

" \n"[i==n]는 평가 식 i==n을 취하거나 0 또는 1로 설정하고 배열 " \n"에 대한 인덱스로 사용하여 ' ' 또는 '\n'.

"YES\0N0"+condition * 4이 포함 하나, 대부분의 표현에 사용했을 때의 첫 번째 요소에 대한 포인터 '감쇄'"YES\0N0" 배열을 취하고,이 포인터 condition * 4를 추가한다. condition이 1이면 "N0"의 시작 부분에 'N'에 대한 포인터가 생성됩니다.

1

i != n 인 경우 %d 뒤에 공백이 인쇄됩니다. 그렇지 않으면 줄 바꿈입니다.

// printf("%d%c", a, " \n"[i==n]); 

// when i != n 
printf("%d%c", a, " \n"[0]); // or 
printf("%d%c", a, ' ');  // or 
printf("%d ", a);  // or 

// when i == n 
printf("%d%c", a, " \n"[1]); // or 
printf("%d%c", a, '\n');  // or 
printf("%d\n", a);  // or 

숫자 구분 기호를 인쇄하는 흥미로운 방법은 for 루프에서 사용하는 것입니다. 조건이 1 인 경우 puts("YES\0N0"+condition * 4);

상태가 0 유사한

그것이 인쇄

puts("YES");` 

, 그것은 인쇄

puts("N0");` // Thanks @ Jonathan Leffler 
+0

엄밀히 말하면, NO 대신'N0'을 인쇄합니다 ... –

+0

@Jonathan Leffler Right y0u! – chux

+0

@JonathanLeffler 내 잘못은 '아니오'여야합니다. – laike9m