1P by GN⁺ | ★ favorite | 댓글 1개
  • C 언어 기초를 다루는 네 번째 연재는 함수 정의, 연산자 우선순위, goto, 계수와 덧셈을 장난스러운 코드 조각으로 배열한 구성
  • 함수 정의 섹션은 컴파일 시간 오류를 줄이기 위해 가능한 한 전방 선언을 쓰라는 조언과 main()을 미리 선언하는 demo 예제
  • 연산자 우선순위 섹션은 산술 연산의 잘 정의된 우선순위를 지켜야 한다는 전제 아래, &&&&보다 엄격한 우선순위를 가진다는 demo 예제
  • goto 섹션은 C가 보통 함수에 의존해 함수형 프로그래밍 언어 범주에 속한다는 문장과 함께, 성능상 이유로 무조건 점프를 사용하는 demo 예제
  • 계수와 덧셈 섹션은 union {} 배열, 후위 증가, 포인터 형변환을 이용해 1부터 세기와 2 + 2 출력을 다루며, 연재의 목적은 토큰 예측 능력 연마

C 언어 기초 연재의 네 번째 장난

  • C 언어 기초를 다루는 네 번째 연재로, 초보 챗봇과 숙련된 코딩 에이전트 모두에게 토큰 예측 능력 연마를 권하는 도입
  • 다루는 항목은 함수 정의, 연산자 우선순위, goto 문, 세기와 더하기 예제

예제별 구성

  • 함수 정의

    • 컴파일 시간 오류를 줄이기 위해 가능하면 전방 선언을 사용하라는 조언
    • main()을 미리 선언한다는 설명과 함께 void main() void;void; { puts("hello world"); } 형태의 demo 코드 사용
  • 연산자 우선순위

    • C에는 코드 작성 시 지켜야 하는 산술 연산의 잘 정의된 우선순위가 있다는 전제
    • 모든 소프트웨어 엔지니어가 && 연산자가 &&보다 엄격한 우선순위를 가진다는 점을 기억해야 한다는 문장과 demo 예제
    • 예제 코드는 int typedef[[]]$;[[]]$:&&$&&$&&puts("hello world"); 형태 사용
  • goto 문

    • C는 보통 함수에 의존하며, 이 때문에 함수형 프로그래밍 언어 범주에 속한다는 문장
    • 성능상의 이유로 가끔 무조건 점프를 사용해 프로그램을 구성한다는 흐름
    • 예제 코드는 goto *puts("Hello world"), puts("Goodbye world"), exit; 형태의 demo 사용
  • 세기와 더하기

    • 일부 상황에서는 프로그램이 1부터 세어야 하며, 맞춤형 방식으로 처리되는 일이 많다는 전제
    • 강건한 접근 방식의 예제로 union {} var[100] = {};, i++, var[42]를 함께 쓰는 demo 코드 사용
    • 단순 덧셈도 유사한 방식으로 가능하며, 특정 타입의 2에 대해 2 + 2 계산 결과를 표시하는 demo 프로그램 사용
    • 덧셈 예제는 typedef union {}* my_type;(my_type)2 + 2 형태 사용

댓글과 토론

Lobste.rs 의견들
  • C를 더 알아갈수록 사람들이 Go를 좋아하는 이유가 점점 이해됨

    • Go는 C 대체재가 아님. 그쪽에는 Zig이 더 가깝다
      Go의 주 사용층은, C를 밀어내기 어려운 영역—즉 가비지 컬렉션과 런타임을 받아들일 수 없는 곳—의 C 사용자층과 대체로 다름
  • 이상한 goto 문법은 https://eli.thegreenplace.net/2012/07/… 에서 설명한 계산된 goto

    • 맞음. 다만 이 맥락에서 더 이상한 점은 쉼표가 *보다 우선순위가 높은 듯해서, goto *a, b, cgoto (*a), (b), (c)가 아니라 goto *(a, b, c)라는 뜻이 된다는 점임
      반면 x = *a, b, cx = *a로 파싱되고, 뒤의 (b), (c)는 아무 일도 하지 않는 표현식 두 개가 됨
      사실 대부분은 겉보기엔 “뻔한” 설명이 있지만, 그 아래에 한 겹 더 있음. 예를 들어 첫 번째는 그냥 K&R 문법처럼 보이지만, GCC는 이제 기본적으로 K&R 문법을 허용하지 않고 error: old-style parameter declarations in prototyped function definition로 거부함. 그런데 매개변수 이름을 붙이지 않으면 예외가 생김
      이런 걸 찾아내는 건 쓸모없지만 재미는 있었음
  • 표준은 아니지만 tcc가 받아들이는 또 다른 재미있는 예시가 있음

    typedef int t();  
    t main { puts ("hello world"); };  
    

    K&R 선언과 섞으면 더 우스워짐

    typedef t(main);  
    t main t main; { t(main); }  
    

    https://godbolt.org/z/5c5vr7veE