336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
main 함수의 마지막에 0을 return하는 이유
main 함수는 우리가 호출하는 함수가 아니라 운영체제에 의해서 자동적으로 호출되는 함수
따라서 return 값은 운영체제로 넘어가는데, 이 때 main 함수를 통해 반환받는 값을 통해 프로그램의 이상 유무를 판단하게 된다.
그리고, 0을 반환한다는 것은 정상적인 종료를 뜻한다.
증가, 감소 연산자
연산자 연산자의 의미
++a 값을 1 증가 후 연산을 진행(선 증가, 후 연산)
a++ 연산을 진행한 후 값을 1 증가(선 연산, 후 증가)
논리 연산자
연산자 연산자의 의미
&& and
|| or
! not
비트 단위 연산자
연산자 연산자의 의미(비트 단위)
& AND
| OR
^ XOR
~ NOT
<< 왼쪽으로 이동
>> 오른쪽으로 이동
연산자의 우선순위와 결합성
우선순위
연산 순위
|
연산자
|
결합성
|
1
|
(), [], ->, .
|
→
|
2
|
sizeof, &, ++, ==, ~, !, *(간접 지정 연산자), +, -(단항 연산자)
|
←
|
3
|
*(곱셈 연산자), /, %
|
→
|
4
|
+, -(이항 연산자)
|
→
|
5
|
<<, >>
|
→
|
6
|
<, <=, >=, >
|
→
|
7
|
==, !=
|
→
|
8
|
&
|
→
|
9
|
^
|
→
|
10
|
|
|
→
|
11
|
&&
|
→
|
12
|
||
|
→
|
13
|
?:
|
←
|
14
|
=, +=, *=, /=, %=, &=, ^=, |=, <<=, >>=
|
←
|
15
|
,(콤마 연산자)
|
→
|
결합성
우선 순위가 같은 연산자가 둘 이상 있을 경우에 무엇을 먼저 연산하느냐를 결정짓는 것
C언어의 키워드
C99를 기준으로 표준화된 키워드들
|
auto
|
_Bool
|
break
|
case
|
char
|
_Complex
|
const
|
continue
|
default
|
restrict
|
do
|
double
|
else
|
enum
|
extern
|
float
|
for
|
goto
|
if
|
_Imaginary
|
inline
|
int
|
long
|
register
|
return
|
short
|
signed
|
sizeof
|
static
|
struct
|
switch
|
typedef
|
union
|
unsigned
|
void
|
volatile
|
while
|
|
|
|
정수와 실수의 표현 방식
정수의 표현 방식
int형 변수의 경우 보통은 4바이트 메모리 공간을 이용해서 데이터를 표현한다.
모든 정수의 가장 왼쪽에 있는 비트는 부호 비트(MSB: Most Significant Bit, 가장 중요한 비트)
음수를 표현할 때는 2의 보수 체계를 기억해야 한다.
2의 보수: 1의 보수를 취한 후, 1을 더한 것.
ex)
5+(-5)의 연산을 진행하는 경우,
-5는 실질적으로 5의 (2의 보수)가 취해진 값이므로
더하면 모든 비트의 값은 0이 되고 올림 수(carry)는 버려진다.
실수의 표현 방식
적은 비트 수를 가지고 넓은 범위의 실수를 표현하기 위해서

위 식을 미리 정의해놓고, 메모리에 할당된 데이터의 일부 비트는 m의 값을 정하고, 일부 비트는 e의 값을 정하는데 사용한다.
이 경우, 넓은 범위의 실수를 표현할 수 있다는 장점이 있지만, 오차가 발생하게 된다.
이러한 오차를 부동소수점 오차라고 한다.
따라서, 컴퓨터는 실수를 근사치만 표현한다.
ex)
위 식으로 0을 표현하는 것은 불가능하다.
기본 자료형 종류와 데이터의 표현 범위
자료형
|
할당되는 메모리 크기
|
정수형
|
char
|
1바이트
|
short (short int)
|
2바이트
|
int
|
4바이트
|
long (long int)
|
4바이트
|
실수형
|
float
|
4바이트
|
double
|
8바이트
|
long double
|
8바이트 혹은 그 이상
|
컴퓨터 내부적으로 int형 데이터를 가장 빠르게 연산한다.
실수 자료형의 정밀도
자료형
|
정밀도
|
float
|
소수 이하 6자리
|
double
|
소수 이하 15자리
|
long double
|
double과 같거나 크다
|
float의 정밀도는 낮으므로 double형을 선호
unsigned +자료형
기본 자료형 앞에 unsigned를 붙이면 첫 번째 비트인 MSB 또한 데이터 비트로 사용하여 데이터 표현 범위가 2배로 넓어진다.
상수
이름이 없는 상수: 리터럴(literal) 상수
int val = 30 + 40;
위 연산을 진행하기 위해서 30, 40은 메모리 상에 이름이 없는 상수로 저장된 후 연산이 진행된다.
이 30, 40을 리터럴 상수라고 한다.
리터럴 상수의 자료형
리터럴 상수 또한 자료형이 있고, 사용자가 자료형을 지정하지 않을 경우 자동으로 자료형이 결정된다.
접미사
|
자료형
|
사용 예
|
u or U
|
unsigned int
|
304U
|
l or L
|
long
|
304L
|
ul or UL
|
unsigned long
|
304UL
|
f or F
|
float
|
3.15F
|
l or L
|
long double
|
3.15L
|
이름이 있는 상수: 심볼릭(symbolic) 상수
const 키워드 혹은 매크로를 사용해서 정의 (이 때, 상수 이름은 가급적 대문자로 정의)
자료형의 변환
자동 형 변환(묵시적 형 변환)
대입 연산 시 발생하는 자동 형 변환
값의 표현 범위가 좁은 데이터를 표현 범위가 넓은 데이터로 변환 시에는 아무런 문제가 발생하지 않는다.
값의 표현 범위가 넓은 데이터를 표현 범위가 좁은 데이터로 변환 시, 데이터의 손실이 발생(소수부의 손실, 상위 비트의 손실)
정수의 승격(integral promotion)
char, short와 같은 정수형 데이터 연산은 일단 int형 데이터로 자동 형 변환된 이후 연산이 이루어지고,
int형 데이터는 형 변환 과정을 거치지 않기 때문에 int형 연산이 빠르다.
int형 연산만 지원하는 것은 정수형 연산을 단일화해서 성능을 향상시키기 위함이다.
산술 연산 과정에서의 형 변환
산술 연산 과정에서 일어나느 형 변환은 데이터의 손실이 최소화되는 방향으로 진행된다.
ex)
double e1 = 5.5 + 7;
double형 데이터로 변환된 후에 연산이 이루어진다.
강제 형 변환(명시적 형 변환)
변수 앞에 (자료형의 이름)
ex)
float f = (float)a / b;
다양한 종류의 특수 문자
특수 문자
|
의미
|
\a
|
경고음 소리 발생
|
\b
|
백스페이스
|
\f
|
폼 피드(form feed)
|
\n
|
개행
|
\r
|
캐리지 리턴(carriage return)
|
\t
|
수평 탭
|
\v
|
수직 탭
|
\\
|
백슬래시
|
\'
|
작은 따옴표
|
\"
|
큰 따옴표
|
서식 문자의 종류와 그 의미
서식 문자
문자열의 출력 양식을 정의하는 문자
서식 문자
|
출력 형태
|
%c
|
단일 문자
|
%d
|
부호 있는 10진 정수
|
%i
|
부호 있는 10진 정수,
%d와 동일
|
%f
|
부호 있는 10진 실수
|
%s
|
문자열
|
%o
|
부호 없는 8진 정수
|
%u
|
부호 없는 10진 정수
|
%x
|
부호 없는 16진 정수, 소문자
사용
|
%X
|
부호 없는 16진 정수, 대문자
사용
|
%e
|
e 표기법에 의한 실수
|
%E
|
E 표기법에 의한 실수
|
%g
|
값에 따라서 %f, %e 둘 중 하나를 선택
|
%G
|
값에 따라서 %f, %E 둘 중 하나를 선택
|
%%
|
% 기호 출력
|
서식 문자
|
출력 형태
|
%8d
|
필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력
|
%-8d
|
필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력
|
%+8d
|
필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는 +, 음수는 -를 붙여서 출력
|
실수형 데이터를 입력받을 때
서식 문자
|
사용
|
%f
|
소수점 6자리 이하인 경우
|
%le
|
소수점 6자리를 넘는 경우
|
while문, do~while문의 차이점
while문은 반복의 조건 검사를 앞에서 실행하므로 조건이 만족되지 않으면 한번도 실행하지 않지만,
do~while문은 반복의 조건 검사를 뒤에서 하므로 반드시 한번의 루프는 실행하게 되어 있다.
for문의 기본 원리와 의미
for ( 초기문 ; 조건문 ; 증감문 )
첫번째 루프에서는 증감문을 실행하지 않는다.
그리고 루프 실행 이후 실행 여부 결정을 위한 조건문 검사 전에 증감문을 실행한다.
초기문, 조건문, 증감문을 반드시 다 채울 필요는 없고 필요한 것만 채워도 된다.
조건문을 비워두는 경우, 무한 루프를 형성할 수 있다.
조건 연산자(삼항 연산자)
조건 ? A : B
조건이 true인 경우, A를 반환
조건이 false인 경우, B를 반환
ex)
x=(y<0)? 10:20
(y<0)이 true이면 10이 반환되여 x에 대입
(y<0)이 false이면 20이 반환되여 x에 대입
루프의 생략과 탈출: continue, break
break
반복문을 탈출할 때 사용하는 키워드
continue
돌던 루프의 남아 있는 부분을 그냥 건너뛰고 새로운 루프를 돌게하도록 하는 키워드
switch에 의한 선택 실행
switch(n)
n은 int, char 형 정수
switch문의 case문에 해당하는 조건이 없는 경우 default문을 실행
case문의 끝에는 break문이 포함된다.
switch문에서는 비교문이 올 수 없다.
goto 키워드
이동할 위치를 표시한 레이블(label)로 보내는 키워드
goto xyz;
...
xyz:
...
변수의 범위(scope)
지역 변수(local variable or automatic variable)
중괄호(지역) 내에 선언된 변수는 모두 지역 변수
중괄호를 벗어나면 선언된 지역 변수는 소멸된다.
지역 변수는 외부에 선언된 동일한 이름의 변수를 가릴 수 있다.
지역 내에서는 지역 변수가 전역 변수보다 우선시된다.
모든 (함수의) 매개 변수는 지역 변수다.
지역을 벗어나면 소멸된다하여 지역 변수를 다른 표현으로 자동 변수라고도 한다.
원칙적으로 지역 변수 선언 시, auto 키워드를 붙여야하지만, 생략이 가능하다.
전역 변수(global variable)
함수의 외부에 선언되고 프로그램 어디에서나 접근이 가능한 변수
선언과 동시에 한번만 초기화되고, 값을 초기화하지 않는 경우 0으로 초기화된다.
프로그램 시작 시 메모리에 로드되고, 프로그램이 종료될 때까지 계속 존재한다.
전역 변수의 수가 많아지면 프로그램은 복잡해질 수 있다. (스파게티 코드, spaghetti code)
따라서, 전역 변수가 반드시 필요할 때만 선언하는 것이 좋다.
static 변수
함수 내 선언된 static 변수는 그 특성이 전역 변수와 비슷하다.
선언된 지역 내에서만 접근 가능하고, 전역 변수와 마찬가지로 프로그램이 종료될 때까지 계속 존재한다.
프로그램이 실행되는 동안에 계속해서 유지되어야 하는 변수가 있다면 static 변수의 선언을 고려하는 것이 좋다.
register 변수
register는 CPU의 접근이 가장 빠른 메모리 공간이다.
CPU의 레지스터는 크기가 제한되어 있는 공간이라 상황에 따라 이러한 요청은 무시될 수 있다.
생성과 소멸이 빈번한 변수를 register 변수로 선언하면 성능 향상을 기대할 수 있다.
컴파일러가 코드 최적화를 수행하는 과정에서 자동으로 register 변수로 선언될 수도 있다.
가변 인자 함수
전달 인자의 개수가 다양한 함수.
C 언어에는 가변 인자 함수의 선언에 대한 문법적 요소가 있다.
ex)
printf, scanf