C - printf와 scanf 사용 방식의 차이점 및 흔한 실수

1. printf에 &(ampersand / 주소 연산자)를 사용하는 실수 1 2 int  i  =   10 , j  =   20 ; printf ( "%d %d\n" ,  & i,  & j); cs printf는 단순히 변수의 값(value)을 출력하는 함수 그런데 위 코드처럼 &를 변수 앞에 붙이면 변수의 주소(address)가 출력됨 따라서 printf에서 &를 사용하면 해당 변수의 주소값을 출력함 printf의 올바른 사용은 아래와 같다. 1 printf ( "%d %d\n" , i, j); cs 반대로 scanf는 입력받은 갑슬 변수에 저장해야 하므로 변수의 주소가 반드시 필요하다. 2. scanf의 포맷 문자열에 불필요한 문자를 넣는 실수 1 scanf ( "%d, %d" ,  & i,  & j); cs %d, 에서 쉼표는 숫자(정수) 다음에 ,(쉼표)가 입력력되어야 한다는 의미 하지만 사용자가 10 20 이렇게 쉼표 없이 입력하면, scanf는 10을 첫 번째 %d로 읽고, 그 다음 명시한대로 쉼표를 찾으려고 하지만 공백(white-space)이므로 그대로 종료한다. 결과적으로 j에는 값이 들어가지 않고, 이전 값 그대로이거나 쓰레기 값이 남을 수 있다. scanf는 포맷 문자열에 명시된 문자 그대로 입력할 것을 기대한다. 3. scanf 포맷 문자열에 \n을 넣는 실수 1 scanf ( "%d\n" ,  & i); cs \n은 scanf 입장에서 공백 문자로 간주된다. scanf는 다음 숫자를 읽은 후에도 공백이 아닌 문자가 나올 때까지 계속 기다린다. 즉 사용자가 Enter를 여러번 눌러도 계속 입력을 기다린다. 

C - 코드의 가독성과 줄바꿈. 한 줄로만 코드를 작성해도 괜찮을까.

코드의 가독성과 줄바꿈 아래 코드처럼 main 함수의 내용을 모두 한 줄에 넣을 수 있다. 코드의 가독성을 신경쓰지 않는다면, IDE의 가로 너비가 넓다면 충분히 가능하다.  int main() { printf("Hello, World!"); return 0; } 다만 모든 코드를 한 줄로 작성할 수는 없다. 특히 C 언어에서 #include, #define 같은 전처리 지시문(preprocessing directives)은 반드시 별도의 줄에 있어야 한다. 따라서 아래처럼 코드를 작성하는 것은 불가능하다. #include <stdio.h> int main() { printf("Hello, World!"); return 0; } 이 방식은 일부 컴파일러에서 작동할 수도 있지만, 전처리 지시문은 일반적으로 반드시 각각의 줄에서 처리 되어야 한다. 결론 한 줄로 작성할 수 있는 경우 : 함수가 짧고 가독성을 크게 해치지 않는 경우 여러 줄로 작성하는 것이 좋은 경우 : 코드의 가독성을 유지하고 유지보수를 쉽게 하기 위해 한 줄로 작성할 수 없는 경우 : 전처리 지시문과 같은 필수적으로 줄바꿈이 필요한 코드

C - 코드의 실행 단계

C 프로그램을 실행 가능한 상태로 만들기 위해서는 아래 세 가지 단계를 거쳐야 한다. Preprocessing(전처리) 프로그램을 전처리기에 전달하여 # 으로 시작하는 지시문(예: #include <stdio.h> )을 처리한다.  전처리기는 마치 편집기와 비슷한 역할을 하며, 프로그램 코드에 추가적인 내용을 삽입하거나 수정하는 역할을 한다. Compiling(컴파일) 전처리된 프로그램을 컴파일러가 받아서 기계어 코드(객체 코드, object code)로 변환한다. 이 상태에서는 실행이 불가능하다. 링크 과정이 추가로 필요하다. Linking(링킹) 컴파일러가 생성한 객체 코드(object code)와 추가적인 코드(예: 표준 라이브러리의 printf 함수 등)를 결합하여 실행 가능한 프로그램을 만든다. 링커(linker)가 이 작업을 수행하며, 이 과정을 거쳐야만 최종 실행 가능한 파일이 생성된다. 위 세 가지 단계는 프로그램 실행 시 자동으로 처리되므로 사용자가 직접 신경 쓸 필요는 없다. 왜냐하면 대부분의 C 컴파일러는 위 세 개 단계를 하나의 명령어로 실행할 수 있도록 되어 있기 때문이다.