unit 75
①
p.906 예제에
#define PRINT_NUM(x) printf("%d\n", x)
이라고 되어있는데
#define PRINT_NUM(x) printf("%d\n", x);
이렇게 끝에 ;(세미콜론)을 붙여도 정상작동이 되더라구요..!
;(세미콜론)을 붙여도 상관없을까요??
②
p.907 예제에
#define PRINT_NUM3(x) printf("%d\n", x); \
printf("%d\n", x + 1); \
printf("%d\n", x + 2);
이것들은
#define PRINT_NUM3(x) printf("%d\n", x); \
printf("%d\n", x + 1); \
printf("%d\n", x + 2); \
\(백슬래쉬)을 붙이나 빼나 상관없을까요??
③
p.910 예제에
while (0) 에
while (0);
이렇게 ;(세미콜론)을 붙이는 걸로 앞에서 배웠는데
;(세미콜론)을 빼도 정상작동이 되더라구요..!
;(세미콜론)을 붙이나 빼나 상관없는걸까요??
감사합니다!!
1. 매크로 정의에서는 끝에 세미콜론을 넣지 않는 게 관례입니다.
C 언어 표준 명세에도 세미콜론이 들어가지 않습니다. 세미콜론은 문장의 종료이고, 매크로에 세미콜론이 있으면 어떤 위치에 쓰였느냐에 따라 문법 에러를 일으킬 가능성이 있습니다.
지금 단계는 관례를 따라 배울 때이지 실험할 때가 아닙니다. 기초 가르쳤더니 기초도 몸에 익기 전에 응용하는 경우가 많습니다. 운동에서는 그러면 큰 부상을 입죠. 정권 지르기는 팔, 팔꿈치, 손목, 주먹이 일직선이어야 하는데, 이 직진성은 1년 이상 수련했을 때 얻어집니다. 조금만 손목이 꺾인 상태에서 실제 타격을 하면 손 인대 부상이나 손목 부상으로 이어집니다. 수련 기간이 짧은 사람은 그래서 송판 격파 등을 시키지 않습니다.
코딩도 수많은 주의사항이 있고, 벗어나면 안 됩니다. C 언어는 특히나 그렇습니다. Go 언어 등은 아예 중괄호 위치, 들여쓰기를 다 강제로 정리하고 벗어나면 에러처리합니다. C 언어는 자유로우니 중괄호, 들여쓰기는 취향 차이인데 갑론을박을 하고, 회사에서도 코드 형식이 통일되지 않아서 논쟁이 벌어지지만, 구글이 회사에서 처음부터 목적을 갖고 만들었기 때문에 Go 언어는 컴파일 전에 코드 형식부터 다 정리해버립니다. 이후에 나온 Rust 언어도 그렇죠.
C 언어는 역사가 긴 언어이고, 거의 대부분의 잘못된 코드도 관대하게 실행하기 때문에 주의사항이 매우 많습니다.
C Faq 참고(영문)
https://c-faq.com/
국문(2018년이 최종, 업데이트 없음)
http://cinsk.github.io//cfaqs/
이것만 해도 360페이지가 넘습니다. C 언어로 현업 코딩할 생각이 아니면 안 보는 게 좋습니다. 볼 이유가 없어요. 시간 낭비. 자바나 다음 언어 공부하고, 자료구조나 알고리즘으로 넘어가세요.
언어 자체를 깊게 파는 건 아무 의미가 없습니다.
파이썬의 데이터 처리에 필수인 Pandas 라이브러리는 파이썬을 2주 동안 공부하고 4년 동안 혼자 개발한 라이브러리였습니다. 지금은 데이터 처리에서 누구나 쓰죠.
https://twitter.com/mxcl/status/608682016205344768?lang=en
Homebrew는 맥에서 쓰는 패키지 관리자이고, 맥 사용자라면 대부분 사용합니다. 구글 엔지니어의 90%는 홈브루를 쓰고 있고, 맥스 하웰은 홈브루 개발자입니다. 그러나 이진 트리를 화이트보드에서 뒤집지 못했다고 면접에서 탈락했죠. 하지만 큰 의미는 없습니다.
quora.com(개발자 지식인)에 직접 답변하는 패기
https://www.quora.com/Whats-the-logic-behind-Google-rejecting-Max-Howell-the-author-of-Homebrew-for-not-being-able-to-invert-a-binary-tree
Homebrew는 2009년에 개발되기 시작했고, 2013년에 킥스타터에서 펀딩했습니다. 4년 동안 혼자 개발하던 것이죠.
귀도 반 로썸이 판든 파이썬은 크리스마스 연휴에 심심풀이로 만든 언어였습니다.
언어에 파고 들지 말고 뭔가를 만드세요. 입문 단계에서 언어를 깊이 파고든다고 한 애들이 뭔가를 만든 게 없어요. 적어도 제 주변은 없습니다.(저는 90년대 학번입니다. 이런 꼰대 같은 발언을 할 자격이 있어요!)
코딩 실력은 거지 같고, 언어에 대한 이해도 형편없어도 그때부터 10년씩 뭔가를 만들었던 사람들만 지금도 잘 하고 있어요. 그런만큼 실력도 늘었지요. 언어를 깊이 이해한다고 하던 사람들은 실력도 그만큼 늘지 않았어요. 뭔가를 끝까지 만들어본 경험은 매우 중요합니다.
유튜브 검색하고 인터넷 검색해서 C 언어로 테트리스라도 만들어보자라고 하는 게 더 낫습니다. 코딩 도장 책을 끝내면요.
돈을 쫓아서 코딩한다는 애들보단 돈도 안 되는 걸 왜 하냐고 했지만, 묵묵히 했던 친구들이 끝은 더 나았습니다.
언어의 문법은 적당히, 필요한 만큼만 알면 됩니다. str[2]나 2[str]이나 이런 건 실력도 아니고 똥 같은 겁니다. 똥으로 자신의 열등감을 표출하는 사람을 만나면 무시하세요. 만들고 싶은 걸 만드세요.
2. 여러 줄일 때 \를 넣는 겁니다. 문장이 여러 개이고, printf 문장으로 끝나야 하니까 끝에 세미콜론을 넣는 겁니다.
3. SWAP(num3, num4, float); 처럼 세미콜론을 붙여서 썼기 때문에
while(0) 뒤에 세미콜론이 없어도 되는 겁니다.
매크로 성격에 따라 쓰면 됩니다.
PRINT_NUM3(x)처럼 3개의 문장이 필요하면 문장은 세미콜론으로 끝나니 세미콜론이 필요합니다.
식(expression)을 대체하는 것이면 세미콜론을 쓰지 않고,
문장(statement)을 대체하는 것이라면 세미콜론을 씁니다.
식은 반드시 값을 반환하는 것이고, 2 + 3은 식입니다.
문장은 완결된 명령이고, 값을 반환하지 않습니다.(함수가 값을 반환하는 거 말고...)
printf("%d\n", 2+3);이면 완결된 명령이므로 문장입니다.
식은 식 안에 쓰일 수도 있고, 문장 안에도 쓰일 수 있습니다.
(2 + (3 * 2)) 같은 것도 가능합니다. 식 안에 식이 있죠.
위에 printf는 문장이지만 2+3은 식이죠.
식은 반드시 값을 반환합니다.
http://www.yes24.com/Product/Search?domain=ALL&query=%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4%EB%A1%A0
컴공이면 프로그래밍 언어론에서 배울 것이고, 악명 높지요.
대충 20여가지 언어 배우고, 10가지 정도 언어로 구구단 만들어 제출하기 같은 것부터 시작할 테니까요.
expression과 statement의 구분 등을 배우겠지요. 학점 잘 안 나오는 과목이죠.
프로그래밍 언어를 만들고 싶으면 대학원 석사 과정으로 가는데, 보통은 그냥 학부 때도 프로그래밍 언어 만들기 하면 됩니다. 책도 있고 유튜브도 있고 많습니다.
현실은 구글, MS 등에서 언어를 만드는 게 아니면 취미입니다. 한국에서 만든 언어는 없습니다(실험실에서는 만들지만, 전 세계에서 쓰는 언어가 있나요? 있으면 알려주시길...)
그러면 대체로 코드 분석해서 버그 찾거나 최적화하는 정적 분석을 석사 때 연구 주제로 잡습니다. 이쪽 코스 갈 거 아니면 패스하시길. 어차피 취업도 안 되는 주제임. 이쪽은 그냥 무조건 유학 가셔야 합니다. 스탠퍼드나 MIT나... C언어부터 현재의 Go, Rust 언어까지 전부 다 미국에서 만들었죠. 러시아? 일본? 독일? 일본은 그나마 Ruby 스크립트 언어 하나 있습니다.
언어 깊이 공부한다는 주화입마에 빠지지 마시길. 한국인 특성이죠.
나는 뭐가 만들고 싶지? 세상을 바꾸는 소프트웨어를 만들고 싶어! 스타트업을 할까? 이런 게 낫지요. 배달의 민족 앱은 세상을 바꿨지요. 그게 한국이라는 테두리지만, 어쨌든.
나는 언어 명세서 읽고 이해하는 게 너무 좋아. 하루 12시간씩 해도 좋아 -> 석박사 가세요. 국내에서 하면 교수 아니면 취업 없음. 유학 가세요.
자기 성향 따라 코스 정하시길...