printf("ho_tari\n");

ep.20 전처리기, 연산자, 표준 입출력 함수, 조건문 본문

두산 로보틱스 부트캠프 ROKEY/C 교육

ep.20 전처리기, 연산자, 표준 입출력 함수, 조건문

호타리 2024. 8. 2. 14:19

2024.8.2

typedef - 자료형 재정의

• 자료형에 새로운 이름(alias) 붙이기 가능

• 형 변환을 할 때 사용할 수도 있고, sizeof() 연산자에도 전달 가능

심볼릭 상수

• 값이 변경되지 않는 상수를 사용해야 할 경우

• 심볼릭 상수(symbolic constant)란 의미 있는 이름을 붙여서 사용하
는 상수
• C 언어에서는 크게 세 가지 방법으로 심볼릭 상수 표현 가능

상수 변수

• 선언할 때 값을 초기화하면, 그 이후에는 코드에서 값을 변경할 수 없는 변수

열거형 상수

• 열거형 상수의 초깃값은 정수 자료형의 값이나 표현식 사용 가능

• enum은 int 형으로 취급

• enum 키워드와 열거형_이름 함께 사용

• typedef 사용

▪ 열거형의 장점 : 코드가 단순해진다, 프로그래머가 실수할 수 있는 여지를 줄인다.

▪ 열거형의 단점 : int 자료형으로 취급된다, 열거형이 달라도 동일한 이름의 열거형 상수를 사용할 수 없다.

 

C 컴파일러의 전처리기

• 소스 코드의 특정 문자열을 다른 문자열로 치환
• 다른 파일 내용 삽입
• 선택적 코드 삭제의 조건부 컴파일 기능
• 궁극적으로 전처리기는 기존 소스 코드를 수정해서 컴파일러에 전달할 새로운 소스 코드를 생성

전처리기 지시자

• 전처리기에서 인식하고 가공하기 위해 사용하는 키워드
• # 기호로 시작

전처리기 코드 작성 방법

• 공백 문자를 제외하고 ‘#ʼ으로 처음 시작하는 줄(line)은 전처리기 코드로 인식
• ‘#ʼ 기호와 전처리기 지시자 사이에 공백 문자들이 포함됨
• 전처리기 코드는 일반적으로 한 줄에 끝남
• 여러 줄에 걸쳐서 전처리기 코드를 작성할 경우 줄 마지막에 ‘\’를 작은 따옴표 없이 붙여 사용

외부 파일 삽입 기능 - #include

• < > 또는 " " 사이에 입력된 외부 파일을 열고 내용을 삽입하라는 코드

• <...>와 "..."의 차이
– 현재는 <...>는 컴파일러가 제공하는 파일, "..."는 본인이 작성한 파일로 가정

매크로 확장 기능 - #define

• 해당 문자열을 다른 문자열로 치환하는 기능
• 매크로 상수와 매크로 함수로 나뉨

• 단순하게 특정 문자열을 다른 문자열로 치환
• 매크로를 상수(숫자, 문자, 문자열 등)로 변환

매크로 상수 - 주의점
• 매크로_이름도 식별자이므로 영문자나 밑줄 문자로 시작
• 두 번째 글자부터는 영문자, 숫자, 밑줄 문자만 사용 가능(공백 문자 포함X)
• 영문자는 보통 대문자로 표현
• 매크로_이름과 치환할_값 사이에 공백 또는 탭으로 분리
• 치환할_값은 생략 가능
• 치환할_값은 공백 문자 포함이 가능
• 치환할_값에는 또 다른 전처리기 지시자 사용 불가
• 치환할_값이 산술 연산식이라면 ( )로 감싸주어야 함
• 문자 상수나 문자열 상수에 있는 매크로_이름이 있다면 변환하지 않음
• #define 이후에 #include되는 파일은 해당 파일에서 매크로_이름을 치환할_값으로 변환

 

연산자

• 피연산자, 우선순위, 결합 순서

 

부호 연산자
• 단항 연산자이고, 표현식의 피연산자에 부호를 붙임

산술 연산자

• 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산자

비트 연산자

• 메모리에 비트 단위로 저장되어 있는 값을 조작하거나 연산을 실행
• 비트 이동(bit shift) 연산자/비트 연산자(bitwise operation)로 나뉨

 

증감 연산자

• 정수 변수와 함께 사용
• 변숫값을 1만큼 증가시키거나 감소
• 변수 앞 또는 뒤에 위치

복합 대입 연산자

• 연산과 대입을 한 번에 쓰는 것
• op는 이항 연산자(+, -, /, *, %, <<, >>, &, ^, |) 중 한 가지 사용 가능

순차 연산자

• 콤마(,)로 표시해서 콤마 연산자라고도 함
• for문에서 사용하는 경우를 제외하면, 많이 사용 안됨
• 왼쪽에서 오른쪽으로 순서대로 표현식의 값을 평가(evaluate)
• 순차 연산자의 결괏값은 가장 오른쪽에 위치한 표현식의 결과값

▪ 여러 개 대입 연산 코드를 한 줄로 압축해서 표현

▪ for 반복문에서 두 개 이상의 변수를 사용 (주 사용처)

 

표준 입출력 함수

사용자로부터 입력받기
• 표준 입력 장치의 입력을 C 언어 프로그램에서 처리할 수 있는 자료형의
값으로 변환하는 것
• 표준 입력 장치 : 키보드, 마우스 등
• 표준 출력 장치 : 터미널 프로그램의 콘솔(console) 화면

서식 지정자를 이용해서 입력받기
▪ scanf( ) 함수
• scanf( ) 함수를 사용하려면 stdio.h 헤더 파일을 포함
• C 언어의 표준 입출력 함수들은 모두 stdio.h에 존재
• 사용자가 입력한 문자열을 코드에 지정된 자료형으로 변환해서 변수에
저장
• 자료형을 지정하는 것은 printf( )에서 사용한 비슷한 서식 지정자를 이용

 

문자 단위 입출력 함수

• getchar(), getc(), putchar() 등
• 사용하려면 stdio.h를 포함해야 함

getchar() 함수
• 표준 입력 장치로부터 글자 한 개를 읽고 반환하는 함수

putchar() 함수
• 영문 알파벳, 숫자, 특수 문자 출력

• 어떤 문자열이든 화면에 출력한 후 무조건 줄바꿈

 

제어 흐름

• 프로그램이 실행되는 흐름을 표현하는 방법
▪ 순차
• 지금까지 main() 안에 있는 코드를 한 문장(statement)씩 순차적으로 (sequentially) 실행
• 중간에 printf() 같은 함수나 scanf() 함수를 실행하지만, 순차적 흐름의 한 문장
▪ 선택 : 주어진 조건에 따라 다른 코드를 실행시키는 것
▪ 반복 : 특정 작업을 거듭 수행하도록 하는 경우에 사용

 

조건 표현식

• 조건식 또는 조건 표현식(conditional expression)은 참/거짓의 불린 (boolean) 값을 반환
• 조건식의 결과에 따라 선택적으로 후속 작업의 실행을 결정
• 조건식에는 상수, 변수, 연산식이 사용
• ANSI C는 불린 자료형이 따로 없음

관계 연산자

• 두 피연산자를 비교해서 참/거짓에 해당하는 값을 생성

주의 사항
• <=, >=, != 는 순서에 맞게 사용
• 주로 사용할 수 있는 자료형으로는 기본형(정수, 실수, 문자형), 포인터 등
• 실수는 저장 방법 때문에 정확하게 비교되지 않을 수 있음
• 대입 연산자 ‘=’와 혼동하지 말아야 함

논리 연산자

• &&, ||, ! 연산자 기호 사용
• 각각 and, or, not 논리 연산을 나타냄

if 문

• 조건식을 평가해서 결괏값이 참(True)이 되면 정해진 코드를 실행
• 조건이 만족되지 않으면 더 이상 아무것도 하지 않음

if-else 문

• 조건이 만족될 때와 만족되지 않을 때 사용
• S1과 S2는 보통 한 줄 이상의 명령문을 나타냄

잘못 자리 잡은 else(dangling else) 문제

• 사용자가 1 이상의 정수를 입력했을 때 짝수이면 짝수라고 출력
• 1 미만의 값이 입력되면 잘못 입력했다고 알리고 종료

if-else if-else 문

• 세 가지 이상 중 한가지만 선택해서 실행할 때 사용

• else 없이 if-else if 문만 사용하는 것도 가능

 

중첩 조건문

• 조건문 안에 다른 조건문을 포함하는 것

 

조건 연산자

▪ 조건 연산자 ?:는 세 개의 피연산자를 취하는 삼항 연산자
• 연산자이므로 값을 생성

 

switch 문

▪ 여러 가지 중 한 가지를 선택하는 명령문
▪ switch 문으로 작성할 수 있는 코드는 if-else if-else 문

switch 문 사용 주의사항
• switch 문의 변수는 정수형과 enum 자료형만 사용
• case에 사용하는 V1, V2 등은 정수형 상수 또는 정수형 상수를 생성하는
표현식만 사용 가능
• case 값은 중복이 불가능. 코드 4-18에서 V1~V5는 다른 값이어야 함
• default는 생략 가능
• case에 있는 S1이나 S2 등은 한 줄 이상의 명령문

 

이렇게 오늘 C 언어의 다양한 문법에 대해서 배우고 실습 문제도 풀어보았다. 확실히 파이썬보다는 복잡한 것 같다. 꾸준한 연습이 필요한 언어이다.