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

콤마

,  : 수식 분리. 가장 낮은 우선순위

 


+ Recent posts