1절 표준 입 ∙ 출력함수
1. 표준 입 ∙ 출력함수
n <stdio.h>에 정의되어 있음
1) 표준 출력 함수
u printf() : 화면에 형식화된 여러 종류의 자료 출력
u putchar() : 화면에 1개 문자 출력
u puts() : 화면에 문자열 출력
2) 표준 입력 함수
u scanf() : 키보드로 1개 이상의 형식화된 자료를 입력 받음
u getchar() : 키보드로 1개 문자 입력 받음
u gets() : 키보드로 문자열 입력 받음
3) 변환명세
u % 기호로 시작하는 형식문자열
u 형식 플래그, 필드폭, 정밀도, 출력변환 지시자로 구성
u 기본 자료형의 변환 명세 : %d(정수 int), %lf(실수 double), %c(문자)
값 |
변환명세 |
자료형 |
형식 |
정수 |
%d |
int형 |
정수를 10진 형태로 입∙출력 |
%i |
int형 |
정수를 10진 형태로 출력 (only출력) |
|
%u |
unsigned int형 |
부호 없는 정수를 10진 형태로 입∙출력 |
|
%o |
int형 |
정수를 8진수로 출력, 8진수를 10진수로 변환 후 입력 |
|
%x |
int형 |
정수를 16진수로 출력, 16진수를 10진수로 변환 후 입력 |
|
실수 |
%f |
float형 |
실수를 소수점아래 6자리로 출력, float형으로 입력 |
%lf |
double형 |
실수를 소수점아래 6자리로 출력, double형으로 입력 |
|
%e |
float형 |
지수 형식(과학적 표기)을 float형으로 입∙출력 |
|
%le |
double형 |
‘가수e지수’형식, 실수값 double형으로 입력 |
|
문자 |
%c |
char형 |
문자 1개 입∙출력 |
문자열 |
%s |
문자열 |
문자열 입∙출력 |
u 필드폭, 플래그, 정밀도
o 필드폭을 명시하지 않을 시 수치 데이터는 기본 왼쪽부터 정렬하여 출력
필드폭을 명시하면 오른쪽으로 정렬하여 출력
o 필드폭을 명시하지 않을 시 문자 데이터는 기본 오른쪽부터 정렬하여 출력
o 지정된 필드폭보다 출력할 값의 자릿수가 크면 출력 형태가 흐트러져 출력됨
2. 출력함수 printf()
n printf(“형식 문자열”, 인수1, 인수2, 인수3,…);
1) 변환명세 포함하지 않은 printf()
u 단순한 특정 문자열 출력
u 이스케이프 문자 출력
2) 변환명세 포함한 printf()
u 변환명세가 n개면 뒤의 인수도 n개
u 필드폭, 플래그, 정밀도를 이용하여 출력한다. (scanf에는 잘 사용하지 않음)
(1) %d를 사용한 정수 출력
o %필드폭d : 필드폭 만큼 칸수 확보, 오른쪽 정렬 됨(필드폭 지정했으므로)
o %+필드폭d : 필드폭 만큼 칸수 확보, 오른쪽 정렬, ( + )양수 부호 출력(필드차지)
o %-필드폭d : 필드폭 만큼 칸수 확보, ( - )왼쪽 정렬
ex) “%-+5d”, 10 -> 5칸 확보, 왼쪽 정렬, 양수부호 표시 + 1 0 _ _
o %0필드폭d : 필드폭 만큼 칸수 확보, 오른쪽 정렬, 왼쪽 빈자리 0으로 채우기
(2) %lf를 사용한 실수 출력
o 필드폭 : 전체 자릿수. 소수점 위 + 소수점 아래
o 정밀도 : 소수점 이하 자릿수
o 기본적으로 실수는 f든 lf든 소수점 이하 6자리 표시하는 것을 명심 ㅎㅎ
o %필드폭.정밀도lf : 필드폭 만큼 전체 자릿수 잡고 정밀도 만큼 소수점 아래 표현
o %정밀도lf : 정밀도 만큼 소수점 이하 자릿수까지 출력
o %필드폭lf : 소수점 위, 아래 포함한 필드폭. 소수점 아래는 6자리까지 확보하여 출력.
만약 자릿수가 모자라면 자릿수 무시하고 소수점 아래까지 모두 출력함
o %필드폭.lf(엘에프 LF) : 소수점 아래 첫 자리에서 반올림하여 출력.
필드폭만큼 칸을 확보해 출력
%필드폭.0lf와 같음
(3) %c를 사용한 문자 출력
o 문자 1개를 출력할 때 사용
o 기본 정렬 방식 : 오른쪽 정렬! (정수, 실수는 왼쪽.. 부호표시가 반대로 되는 거지!)
o %필드폭c : 필드폭만큼 자리 확보하고 문자형식으로, 오른쪽 정렬하여 출력
o %-필드폭c : 필드폭만큼 자리 확보하고 문자형식으로, 왼쪽 정렬하여 출력
(4) %s를 사용한 문자열 출력
o 문자열 출력
o 기본 정렬 방식 : 오른쪽 정렬
o 기본 자료형이 없음.(문자는 char이지만)
o %필드폭s : 필드폭만큼 자리 확보하고 문자열 형식으로 오른쪽 정렬하여 출력
o %-필드폭s : 필드폭만큼 자리 확보하고 문자열 형식으로 왼쪽 정렬하여 출력
3. 문자와 문자열 전용 출력 함수
n 변환명세를 사용하지 않는 함수
1) 문자 전용 출력함수 putchar()
u printf 함수보다 실행속도 빠르고, 문자 출력 여러 번 반복할 때 사용
u putchar(‘문자’ or 문자형 변수);
2) 문자형 자료의 ASCII code 값의 변환
u 기본적으로 문자형의 char자료형으로 선언하고 컴퓨터 메모리에서 1byte 저장공간을 확보한 후 변수를 저장함
u 변수 저장 시 ASCII code 값으로 저장되는 것
u 문자와 ASCII code 값의 변환은 변환명세 ‘%c’로 자유롭게 바꿀 수 있음
u ASCII code 값은 2진수, 10진수, 16진수 등으로 표현 가능하므로 이 값들을 산술연산 한 결과를 문자 변환명세로 표현가능
char ch1 = ‘A’ + 1;
putchar(ch1); // B 출력 ( A : ASCII code 65 + 1 = 66 -> B의 ASCII code : 66)
3) 문자열 전용 출력함수 puts()
u 한 문자열을 출력한 후 커서의 위치를 자동으로 다음 행에 이동시킴
u puts(“문자열” or 문자열을 저장한 변수);
4. 입력함수 scanf()
1) 한 개의 자료만 입력
u 메모리 기억장소를 알 수 있는 연산자 ‘&’를 변수명 앞에 붙여줌
u scanf(“변환명세”, &변수명);
(1) 한 개의 자료만 입력 시 주의사항
o 변환명세 후에 공백이나 이스케이프 문자를 사용하지 않는다.
◇ 프로그램 실행하면 키보드로부터 자료입력 후에도 계속 커서 깜박이며 입력 기다림
◇ 공백 제외한 자료를 입력해야 프로그램이 진행되고, 두 번째 입력 받은 값은 그 다음 입력 함수에서 지정한 변수에 저장됨
◇ 변환명세는 %d, %lf, %c, %s 등만을 사용하는 것이 안전함
o 변환명세에 필드폭은 꼭 필요할 때에만 사용한다.
◇ 필드폭보다 더 긴 수를 입력하면 그 후 자릿수는 입력되지 않고, 필드폭만큼의 자료만 입력 받음
o 자료형에 맞는 변환 지시자(%d, %lf, %c, %s)를 사용한다.
◇ 이상한 결과값을 얻음
(2) %s를 사용한 문자열 입력
o 문자열을 저장하는 변수명이나 배열명은 그 자체가 문자열을 저장하게 될 메모리 시작번지
ð & 붙이지 않음 (& : 변수의 주소를 가리키라는 연산자! 그런데 배열명이나 문자열 변수명은 자기 자신이 이미 포인터임)
o scanf(“%s”, 문자열을 저장할 변수명);
char name[10];
scanf(“%s”, name); // name이 배열이므로 변수명이 포인터
2) 여러 개의 자료를 한꺼번에 입력
u scanf(“변환명세 n개 포함한 형식 문자열” ,&변수명1, &변수명2, … ,&변수명n);
(1) scanf(“%d %d %d”, &변수명1, &변수명2, &변수명3);
o 변환명세 사이에 구분자가 없음.
o 변환명세 사이에 공백을 넣어도 됨(자료 한 개 입력 받을 때는 안됨)
o 자료 간 구분은 C언어의 공백문자(스페이스바, 탭, 엔터키) 사용
o 입력의 끝은 엔터키
(2) scanf(“%d, %d, %d”, &변수명1, &변수명2, &변수명3);
o 변환명세 사이에 구분자를 넣었음
o 자료 입력 시 명세 사이 구분자와 같은 구분자를 써줘야 함
(3) 여러 개 자료 입력 시 주의사항
o scanf() 함수의 “형식 문자열” 안의 변환 명세 개수와 입력 변수의 개수가 같아야 함
◇ 변환명세 개수 < 입력변수 개수
쓰레기 값이 합산되어 출력되어 이상한 결과가 나옴
◇ 변환명세 개수 > 입력변수 개수
출력의 결과는 표시되지 않고 프로그램 종료됨
5. 문자와 문자열 전용 입력함수
1) 문자 전용 입력함수 getchar()
u 한 개의 문자를 반환 값으로 변수에 저장
u 변수 = getchar();
char grade;
grade = getchar();
2) 문자의 연산
u 문자는 ASCII code값이 부여되어 있으며, 문자와 정수 간 상호 변환을 활용
u 대소문자 변환, 문자 숫자 변환 등
char small, large;
small = getchar();
large = ‘A’+(small - ‘a’); // A – a = 65 – 97 두 문자간 차이가 음수이므로..ㅎㅎ
printf(“입력한 소문자%c의 대문자는 %c이다.”, small, large);
3) 문자열 전용 입력함수 gets()
u 변환 명세 필요 없고 엔터키 입력하기 전까지의 모든 문자가 문자열로 저장됨
u gets(문자열 저장할 변수); (문자열 변수는 변수명이 포인터)
2절 C언어의 연산자
1. 연산자의 종류
1) 논리 연산자
u 논리 값을 이용한 논리연산
u 논리곱(AND, &&), 논리합(OR, | |), 부정(NOT, !)
u 연산 결과는 1(참, true), 0(거짓, false)로 나타남
u && : 둘 다 1일때만 1, | | : 둘 중 하나만 1이어도 1
변수 |
기능 |
||||
a |
b |
a && b |
a | | b |
a ! |
b ! |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
2) 증감 연산자
u 변수의 값을 1만큼 증가 또는 감소시킴
u 전위형과 후위형으로 구분하여 연산
종류 |
증감 연산자 |
연산 결과 |
전위형 |
++a |
a 값이 1 증가한 후, 증가한 값으로 연산 수행 |
--a |
a 값이 1 감소한 후, 감소한 값으로 연산 수행 |
|
후위형 |
a++ |
현재 a 값이 연산에 사용된 후, a 값이 1 증가 |
a-- |
현재 a 값이 연산에 사용된 후, a 값이 1 감소 |
int a = 10, b = 3, c = 0; a++; printf(“a = %d”, a); a = ++a * 5; printf(“a = %d”, a); c = a-- * ++b; printf(“c = %d”, c--); |
è 변수 선언 è a 후위 연산. 연산할 게 없으니 è a = 11 출력 è a전위연산으로 12 * 5 è a = 60 출력 è a 후위연산 b 전위연산 60 * 4 연산 è c = 240 출력. c가 후위연산이므로 후에 연산 하고 –됨 |
3) 비트 연산자
u 컴퓨터 통신에 많이 사용됨
u 비트연산의 대상이 되는 자료형은 반드시 정수형
(1) 비트 논리 연산자
o 2 진수 각 자리에 대한 연산 수행
o AND(&), OR( | ), XOR(^), NOT(~) 연산
비트변수 |
a&b |
a|b |
a^b |
~a |
~b |
설명 |
|
a |
b |
||||||
0 |
0 |
0 |
0 |
0 |
1 |
1 |
입력 비트 중 하나라도 0이면 연산 결과 0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
입력 비트 중 하나라도 1이면 연산 결과 1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
두 비트 입력이 서로 다른 경우 연산 결과 1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
단항 연산자. 입력 비트 반전을 연산 |
C 컴파일러는 int 메모리를 4byte 확보하니 그 모든 비트를 다 계산하는 것
(2) 비트 이동 연산자
① 왼쪽 비트 이동 연산자
◇ 피연산자 << n;
◇ 피연산자 각 비트값을 왼쪽으로 한 비트씩 이동하기를 n번 반복
◇ 왼쪽으로 밀려난 비트값 제거되고, 오른쪽 비트는 0으로 채워짐
◇ 곱셈효과 : 왼쪽으로 n비트 이동 -> 피연산자 * 2^n
◇ 부호 비트 값이 바뀔 수 있으므로 부호 없는 자료형에 사용하는 것이 바람직
② 오른쪽 비트 이동 연산자
◇ 피연산자 각 비트값을 오른쪽으로 한 비트씩 이동하기를 n번 반복
◇ 오른쪽으로 밀려난 비트값 제거되고, 왼쪽 빈 비트에 부호 비트값 채워짐
◇ 나눗셈 효과 : 오른쪽으로 n비트 이동 -> 피연산자 ÷ 2^n
◇ 정수 간 연산이므로 몫을 구하는 효과!!
◇ 일반 곱셈 나눗셈 연산보다 빠름
4) 형 변환 연산자
u 두 피연산자의 자료형이 일치하는 경우에만 연산
u 피연산자의 자료형이 서로 다를 경우 연산을 수행할 떄 자료형을 하나로 통일하는 형변환 발생
(1) 자동(암시적) 형 변환
① 형 넓힘(promotion) 변환
◇ 표현 범위에서 큰 표현범위의 자료형으로 변환
◇ char < short < int, long < float< double
② 형 좁힘(demotion) 변환
◇ 대입할 때 발행
◇ 왼쪽 변수의 자료형에 맞추어 형 변환 발생
(2) 강제(명시적) 형 변환
o 형 변환 연산자를 이용해 사용된 곳에서만 일시적으로 형 변환 발생
o (자료형) 피연산자
o 변수 자체의 기억장소 크기가 변경되는 것이 아니므로 대입문 왼쪽의 변수는 사용 불가능
5) 콤마 연산자, 주소 연산자, sizeof 연산자
(1) 콤마 연산자
o 수식을 분리하는 연산자
o 우선순위가 가장 낮음
o 출력 : 콤마 연산자 중심으로 왼쪽과 오른쪽에 수식이 올 수 있음. 왼쪽부터 수식 연산하고 오른쪽 수식을 연산 후 좌측항 변수에 대입하여 저장함
int a, b;
b = (a = 10 + 20, a -5); // -> a=30 연산 후 30-5 a = 25 된 뒤 대입 연산 됨
(2) 주소 연산자
o 앰퍼샌드 ( & ) : scanf() 함수의 변수 앞에 사용하는 연산자
o 변수에 할당된 기억 공간의 주소 알 수 있음
o 기억장치 주소는 일반적으로 1byte 단위임
o 메모리 주소 표시할 떄는 printf() 함수의 변환명세를 16진수로 표시
int a;
scanf(“%d”, &a);
printf(“입력 받은 a의 주기억장치 주소는 -> %x이다.”, &a);
(3) sizeof 연산자
o 자료가 저장된 공간의 크기를 byte 반환
2. 연산자 우선순위와 결합 방향
우선순위 |
분류 |
연산자 |
결합방향 |
1 |
단항 |
( ) :함수 호출, [ ] :인덱스, → :간접지정, . : 직접지정 |
→ |
2 |
++, --, + : 부호, - :부호, sizeof, ~ , ! , * :참조, & :자료형, 주소연산자 |
← |
|
3 |
산술 |
*, /, % |
→ |
4 |
+ , - |
→ |
|
5 |
이동 |
<<, >> |
→ |
6 |
관계 |
<<=, >>= |
→ |
7 |
==, !== |
→ |
|
8 |
비트 |
& |
→ |
9 |
^ |
→ |
|
10 |
| |
→ |
|
11 |
논리 |
&& |
→ |
12 |
| | |
→ |
|
13 |
조건 |
? : : 삼항 연산자 |
→ |
14 |
대입 |
=, +=, -=, *=, /=, %=, &=, !=, ^=, <<=, >>= |
← |
15 |
콤마 |
, : 수식 분리. 가장 낮은 우선순위 |
→ |
'[시험] 독학사 2020 전공기초' 카테고리의 다른 글
[독학사][C프로그래밍] 06 배열과 포인터 (0) | 2020.04.28 |
---|---|
[독학사][C프로그래밍] 05 함수와 기억클래스 (0) | 2020.04.28 |
[독학사][C프로그래밍] 04 제어문 (0) | 2020.04.28 |
[독학사][C프로그래밍] 02 자료형과 선행처리기 (0) | 2020.04.28 |
[독학사][C프로그래밍] 01 C언어의 개요 (0) | 2020.04.28 |