#include<stdio.h>

#define ST1 \"*   *   *\\n\"
#define ST2 \"        *\\n\"
#define ST3 \" ********\\n\"
#define ST4 \"*****\"
#define ST5 \" ***\\n\"
#define ST6 \"%s%s%s%s%s\"

main()
{
   printf(ST6, ST1, ST1, ST4, ST5, ST1);
   printf(ST6, \"*   *\", ST5, ST4, \"   *\\n\", ST2);
   printf(ST6, ST3, ST2, ST3, \" *\\n\", ST3);
}
출력문 내부 내용을 define으로 때웠다는걸 알 수 있을거다. 멍청이가 아니라면 \\n이 줄바꿈인건 알지?
첫번째 출력문의 내용을 고대로 바꾸면
printf(\"%s%s%s%s%s\", \"*   *   *\\n\", \"*   *   *\\n\", \"*****\", \" ***\\n\", \"*   *   *\\n\");//맨 앞의 ST6는 string 5개 출력이라는 의미고 뒤의 패러미터들은 각 위치에 들어갈 string임
고대로 찍어보면

*   *   *
*   *   *
********
*   *   *

요런거임. 실제 출력은 안해봐서 콘솔엔 어찌 나올지 모르겄다.
여튼 이걸 존나 반복해서 별모양 만드는거임

---------------------------------------------------
#include<stdio.h>

main(int i, int j)
{
   if(i > 7) return;
   for(j=-1;++j<7;putchar(i<5?j+i<4?\' \':2-j+i<0?\' \':\'*\':i-j<5?j+i<11?\'*\':\' \':\' \'));
   puts(\"\");
   main(++i, j);
}

만약 프로그래밍 전뉴비면 모를수도 있는 문제인데 이런형식을 재귀호출이라고함. 좀더 깊게 들어가면 활성 메모리부분도 알아두면 좋겠지만 지금 그딴게 필요한건 아님. 다만 저기에서 if(i>7) return;이 없으면 스택 오버플로우난다는건 알아뒀으면 좋겠음

재귀호출을 간단하게 설명하자면 자기가 자기 자신을 호출하는거임. 즉 함수 A를 정의했다고 했을때 A내부에서 A를 호출하는 부분이 있을경우 재귀호출이 됨. 다만 명확한 종료조건이 있어야할거임. 근데 내가보기엔 딱히 J는 넘겨줄 이유가 없어보이는데 왜넘기는질 모르겠음.

for문의 구조는
for(A;B;C)인데
A는 초기화 부분이고 초기실행 한번만 실행됨, B는 조건체크부분이고 C는 매회 수행 반복해서 수행되는데 이 미친 코드는 for내부에 들어갈 내용을 여기다 쑤셔밖은거임
i<5?j+i<4?\' \':2-j+i<0?\' \':\'*\':i-j<5?j+i<11?\'*\':\' \':\' \'
이런코드는 다른사람이랑 작업할때 이따구로 작성하면 레알 쌍욕처먹으니 이딴식으로 짜지말길 바람. 여튼 해석하면

i<5 조건으로 true이면 j+i<4를 체크하고 false이면 :i-j<5를 체크함
다시 j+i<4가 true이면 \' \'를 찍고 false이면 2-j+i<0을 체크함
i-j<5 가 true이면 j+i<11을 체크하고 false 이면 \' \'을 찍음

다시 2-j+i<0이 true이면 \' \'을찍고 false이면 \'*\'을찍음
그리고 j+i<11 true이면 \'*\'을찍고 false이면 \' \'을찍음

봐도 엄청 병_신같지 않음? 괄호로 묶으면 아래처럼묶임

i<5?(j+i<4?\' \':(2-j+i<0?\' \':\'*\')):(i-j<5?(j+i<11?\'*\':\' \'):\' \')

인거임. 괄호로 묶어놔도 병_신같네.
여튼 이 의미는 for문의 조건제어를 통해 i만큼 돌아서 한줄찍고 puts(\"\")로 줄바꾼다음 i++해서 재귀호출하는 형태임. 총 7줄을찍는다는걸 알 수 있음. 캐릭터 7개를찍으니까 7x7짤 마름모겠네.

코드가 거지같아서 해석해도 엿같은듯. 여튼 사장님한테 욕먹으면서 썼으니 설명이 좀 엿같아도 감안해주길 바람.