728x90
반응형

<디버깅>

1. 프로그램 오류의 종류와 디버깅
버그프로그램에 존재하는 오류
디버깅오류를 고치는 행위
컴파일 에러문법적 오류. 컴파일러는 프로그램의 구문, 데이터, 의미없는 문장 등을 검사
컴파일 경고: 오류는 아니지만, 오류의 가능성이 있는 부분
런타임 오류실행시간 오류. 프로그램의 결과가 의도와 다르거나 비정상적으로 종료되는 경우

2. 프로그램 오류 비교

1) 컴파일 오류/경고 확인 및 수정
- 컴파일 요류/경고를 고치는 과정은 매우 쉬움
- 오류로 표시된 라인과 실제 오류가 있는 라인은 다를 수 있음
ex) 세미콜론 누락, 중괄호 오류
가장먼저 표시되는 오류내용부터 확인하고 수정
- 실제 오류는 하나이지만 이로 인해 여러군데 오류가 발생하는 것처럼 보일 수 있음
- 맨 처음 오류내용을 해결하면, 나머지는 저절로 해결되는 경우 많음

2) 컴파일 오류/경고와 빌드
컴파일 오류가 있으면 실행파일이 생성되지 않음
- 컴파일 경고는 있어도 실행파일 잘 생성됨

- VS의 경우( [Ctrl+F5] )
>> 소스가 변경된 경우 프로그램 빌드에 성공하면 > 프로그램 수행
>> 프로그램 빌드에 실패하면 > 기존 실행파일 수행

3) 런타임 오류 확인 및 수정
- 프로그램 실행 시 발생하는 오류
일반적으로 오류가 어디서 발생했는지 알기가 어려움
- 대부분의 시간을 이 오류를 찾고 수정하는데 소비
- 이러한 종류의 오류를 찾아 고치는 작업 >> 디버깅

3. 디버깅

1) 방법1. 프로그램 소스를 쭉 보면서 내가 어디서 틀렸나 찾아본다
- 코드가 짧은 경우에 유효
- 코드가 긴 경우 못찾을 가능성이 훨씬 큼

2) 방법2. 실제로 프로그램을 수행시켜보면서 프로그램이 내가 예상하고 원하는 과정대로 동작하는지 체크
- 계산된 결과가 맞는지 체크
- 화면에 결과값들을 출력해 보기

3) 디버깅의 기본
- 코드 중간에 있는 오류를 찾기 위해 프로그램이 내가 의도하는 과정대로 동작하는지 체크
제어 흐름과 변수에 저장된 값 및 주소를 확인

- 간단한 방법은 화면에 결과값을 출력해서 확인하기
코드에 값 체크용 조건문을 넣어서 확인
- 또는 개발툴에서 제공되는 디버깅 기능 활용하기

4) 반복문 체크 요령
반복문 시작 또는 끝 지점에서 체크

5) 함수 체크 요령
함수 시작과 끝 지점에서 체크

728x90
반응형

'Programing > C언어 개념 정리' 카테고리의 다른 글

C언어 개념 정리: 문자열  (1) 2024.11.13
C언어 개념 정리: 포인터  (0) 2024.11.12
C언어 개념 정리: 함수  (3) 2024.11.10
C언어 개념 정리: 배열  (1) 2024.11.09
C언어 개념 정리: 반복문  (1) 2024.11.08
728x90
반응형

8. 함수

8.1. 함수 개요

1) C언어에서 함수
- 어떤 특정한 일을 수행하는 독립적인 단위
- 함수의 예시: printf(), scanf(), main()

2) 함수의 구성
- 함수 정의부: 함수를 구현하는 부분
- 함수 호출부: 함수의 기능을 이용하는 부분

8.2. 함수 정의

1) 함수 정의
- 함수가 수행해야 할 기능 명세하기
- 구문

반환형 함수이름 (인자선언1, 인자선언2, ...)
{
	// 함수 몸체
	// 함수의 수행코드
	return 문;
}



2) 함수 정의 요소

>> 함수이름
- 함수이름 규칙은 변수명 규칙과 동일
- 의미있는 이름 사용 권장

>> 함수인자 or 매개변수
- 함수의 입력 데이터를 나타내는 변수들
- 인자가 다수인 경우 콤마로 구분
- 인자가 없더라도 소괄호는 반드시 필요 (또는 Void 작성)

>> 반환형(return Type)
- 함수가 수행된 후에 반환하는 결과의 자료형
- 아무 결과도 반환하지 않으면 자료형에 void를 씀 (이 경우 return문이 필요없음)

>> 함수 몸체(body)
- 함수가 수행해야 할 작업을 {} 안에 명세
- 함수는 제어 흐름에 따라 수행: 맨 마지막 문장까지 수행되거나 return 문을 만나면 종료

>> return 문
- 함수를 종료하고 함수의 결과를 반환하는 역할
- 반환형이 void인 경우 보통 return문을 사용하지 않지만, 중간에 함수를 종료시키기 위해 사용하기도 함

8.3. 함수 호출과 반환
- 함수를 불필요하게 여러번 수행하지 않도록 유의
- 함수구성은 일을 독립적인 단위로 어떻게 나누느냐에 따라 달라짐
- 함수는 코드 작성의 효율성과 가독성을 높여줌

8.4. 함수와 변수의 종류

1) 함수와 변수
- 함수는 특정한 일을 하는 독립적인 단위
- 함수 기능 뿐만 아니라 함수에서 사용하는 변수에도 독립성이 적용
>> 즉, 함수에서 선언된 변수들은 그 함수에서만 유효
- 경우에 따라서 특정 함수에만 국한되지 않고, 함수와 무관하게 사용되는 변수가 필요

2) 변수 종류

(1) 지역 변수
- 선언 위치: 함수 내에서 선언
- 유효 범위: 변수를 선언한 함수 내에서만 (지역적으로) 유효
- 변수의 지속시간: 함수 호출 시 생성, 함수 종료 시 소멸
>>함수 호출과 동시에 자동으로 생성되고, 함수가 종료되면 자동으로 소멸되어 자동변수라고도 함
- 함수의 형식 인자도 지역변수임

(2) 전역 변수
- 선언 위치: 함수 밖에서 선언
- 유효 범위: 프로그램 내 어디서든 사용 가능
- 변수의 지속시간: 프로그램 실행 시 생성, 프로그램 종료 시 소멸

- 자동으로 0으로 초기화(그러나 모든 변수는 명시적으로 초기화 하는 습관을 가지자)
- 동일한 이름의 전역 변수와 지역 변수가 있는 경우 지역 변수가 우선된다.

- 전역 변수는 함수 사이의 데이터 전달을 위한 또하나의 수단
>> 그러나 함수의 독립성을 해칠 수 있어 신중하게 사용

(3) 정적 변수
- static 키워드 사용
>>

static int x = 0;



- 선언 위치: 함수 내 선언
- 유효 범위: 선언한 함수 내부
>> 지역 변수와 공통점: 변수의 지속시간. 프로그램 실행 시 생성, 프로그램 종료 시 소멸
>> 전역 변수와 공통점: 프로그램 실행 전체 과정 동안 딱 한번만 생성되고 초기화

8.5 함수에 배열 전달

1) 배열의 개별 원소 전달
- 함수의 인자에서 사용된 배열 원소는 수식의 일부일 뿐
- 배열 원소는 일반 변수와 동일하게 취급
- 형식 인자에서 그냥 변수로 명시

2) 배열 전체 전달
- 형식 인자에서 배열로 명시
- 다만, 형식인자에서 배열 크기 명시해도 의미 없음 >> 생략
- 만약, 배열 크기가 필요한 경우 별도의 함수 인자로 전달
- 배열 전체가 전달된 경우, 호출된 함수에서 배열의 값을 바꾸면, 호출한 원래 함수의 배열 값도 바뀜

- 다차원 배열인 경우, 2차원 이상부턴 배열 크기 명시해야함

8.6 함수와 라이브러리

1) 라이브러리
함수를 구현해 모아 놓은 것
- 필요 시 함수를 호출하여 사용

2) 표준 라이브러리
- C언어에서 정해놓은 표준 함수들로 구성: printf(), scanf() 등

3) 표준함수 사용
- 함수의 형태와 기능만 알고 있으면 활용할 수 있음
- 어떻게 구현되어 있는지는 몰라도 됨
- 호출하기 전에 함수 원형이 선언되어 있어야 함
- #include문으로 헤더파일을 소스코드에 포함시킴
- 헤더 파일: 확장자.h의 형태로 이루어짐. <stdio.h>등

4) 자주 사용되는 C 표준 헤더 파일 및 표준 함수
<stdio.h>: 입력, 출력, 파일
>> printf(), scanf(), putc(), getc(), fopen() 등


<stdlib.h>: 숫자 변환, 동적 할당
>> atoi(), rand(), srand(), malloc(), free() 등


<ctype.h>: 문자 검사 및 변환
>> Isalnum(), isalpha(), islower(), topper() 등


<math.h>: 수학 함수
>> sin(), asin(), exp(), log(), pow(), sqrt(), abs()등


<time.h>: 시간 처리
>> clock(), time(), difftime() 등


<string.h>: 문자열, 메모리 블록
>> strcpy(), strcat(), strcmp(), strlen(), memcpy() 등

728x90
반응형
728x90
반응형

<배열>

1. 배열 개요

1) 배열이란?
같은 자료형의 변수 여러개를 하나로 묶은 자료형
- 배열을 이용하여 많은 변수를 한번에 선언하고, 저장된 데이터를 처리할 수 있음

2. 배열 선언과 사용

1) 배열의 선언
자료형 변수명[배열 크기];
- 자료형 뒤에 변수 이름 뒤에 필요한 변수의 개수 명시
- 예시) 

 int x[10];



2) 배열의 원소
- 배열의 각 원소는 하나의 일반 변수와 동일하게 취급

3) 배열의 인덱스(첨자)
- 배열의 각 원소의 위치를 나타내는 대괄호 안의 번호: x[0], x[1], ...
0부터 시작

4) 배열 입력받기
- 각각의 요소에 대해 scanf와 자료형에 맞는 서식 지정자를 사용하여 입럭

>> 문자열 입력받기
(1) 반복문과 %c를 사용하여 하나씩 입력받기
- 문자 하나하나 엔터로 입력받는 방법

for(int i = 0; i<n; i++){
	scanf("%c", &x[i]);
}



(2) %s를 사용하여 한번에 입력받기
- 문자열을 한번에 입력하는 방법

- 문자열의 끝에 '\0' (NULL) 문자가 자동으로 저장됨

scanf("%s", x);



(3) getchar()를 이용하여 \n(줄바꿈)까지 문자열의 하나로 입력받는 방법
- 문자열을 한번에 입력 받을 수 있음
- 엔터를 친다고 입력이 끝나지 않음
- 줄바꿈도 배열의 요소로 저장된다.

for(int i = 0; i<n; i++){
	x[i] = getchar();
}



>> 숫자(정수) 입력받기
(1) 반복문과 서식지정자 %d를 사용하여 하나씩 입력받기
- 숫자 하나하나 엔터, 스페이스 바로 입력받는 방법

for(int i = 0; i<n; i++){
	scanf("%d", &x[i]);
}



5) 배열 초기화
- 배열 선언과 동시에 초기화: 중괄호{} 안에 배열의 초기화 값을 쉼표로 구분하여 나열

int x[5] = {1, 2, 3, 4, 5};



- 배열의 크기보다 초기값의 개수가 작으면: 앞원소부터 차례로 채워지고, 나머지는 0으로 채워짐
- 배열의 크기보다 초기값의 개수가 크면: 컴파일 오류
- 배열의 크기를 지정하지 않으면: 배열의 크기가 초기화에 사용된 원소 수로 결정됨

sizeof(배열): 배열의 크기(길이) 반환
sizeof(배열의요소): 배열 요소 하나의 크기(바이트) 반환

3. 다차원 배열

1) 다차원 배열
첨자가 두개 이상인 배열
- 배열을 여러 개 묶어 배열의 배열을 만들면 된다.

2) 2차원 배열의 선언
- 자료형 변수명[크기][크기]
ex)

int x[3][5];



3) 2차원 배열의 원소
- 두개의 첨자를 이용하여 표현
- 각 차원의 첨자는 0부터 시작
x[0][0] x[0][1] x[0][2]
  x[1][0] x[1][1] x[1][2]
  x[2][0] x[2][1] x[2][2]
- 각각의 원소는 하나의 일반 변수와 동일하게 취급

4) 2차원 배열과 반복문
- 예시) 모든 학생의 점수 출력

for(int i = 0; i < 3; i++){
	for(int j = 0; j < 5; j++){
		printf("%d ", x[i][j]);
	}
	printf("\n");
}



5) 2차원 배열 초기화

 

(1) 중첩 중괄호를 사용하여 행별로 초깃값 설정
- 값이 지정되지 않은 원소는 0으로 초기화

ex)

int x[3][5] = { {10, 20, 30}, {40, 50, 60, 70} };



(2) 하나의 중괄호를 사용하는 형태도 가능
- [0][0]부터 차례대로 채워짐

ex)

int x[3][5] = {10, 20, 30, 40, 50, 60, 70}



6) 배열 전체를 0으로 초기화 하기
- 단일 중괄호, 중첩 중괄호 둘다 사용가능

int x[3][5] = { {0} };

 

int x[3][5] = {0};



7) 배열 크기를 초깃값 개수로 정하기
- 첫번째 첨자만 생략가능, 두번째 첨자는 생략 불가능

ex)

int x[ ][2] = { {0,1}, {0}, {0} };


8) 3차원 이상의 배열
- 2차원 배열과 비슷한 방법으로 확장
- 2개의 반의 학생 3명의 국어와 영어 성적 처리

int score[2][3][2] = { { {20, 90}, {70,36}, {30, 50} }, { {30, 90}, {80, 40}, {40, 60} } };



4. 함수에 배열 전달

1) 함수에 1차원 배열 전달하기
- 배열 크기 명시해도 의미없음 >> 보통 생략
- 배열의 크기가 필요한 경우 별도의 함수 인자로 전달

ex)

void print_arr(int x[], int n);



2) 함수에 다차원 배열 전달하기
- 첫번째 첨자의 크기는 의미없음 >> 보통 생략
두번째 이후 첨자는 명시 필요

ex)

void print_arr( int x[][5], int n);






728x90
반응형
728x90
반응형

6.1 반복문 개요

1. 제어문
- C언어는 순차처리언어로, 특별한 지정이 없으면, 소스코드 첫 줄 부터 차례대로 처리
- 그러나 문제해결 위해 처리 흐름 제어 필요 >> 제어문
- 에시) 조건문, 반복문

2. 반복문
- 특정 조건을 만족하는 동안 계속 반복하여 실행하는 문장
- 루프(loop)라고도 불림
while 문, do-while 문, for 문

6.2 while 문

1. while 문 구조
- 조건식이 참인 동안 중괄호로 둘러싸인 블록 안의 문장 반복
- 조건식이 거짓이 되면 while문 빠져나옴
- 반복할 문장이 하나이면 중괄호 생략 가능

- 코드 구조

while(조건식){
	반복할 문장;
}



6.3 do-while 문

1. do- while 문 구조
- 반복할 문장을 실행한 후에 조건식 검사
- 반복문 내에 있는 문장을 최소한 한번 실행하고자 할 떄 유용
- 마지막에 세미 콜론을 반드시 써야한다

- 코드 구조

do{
	반복할 문장;
} while(조건식);



6.4 for 문

1. for 문 구조
- 일반적으로 반복하는 횟수가 정해진 경우에 사용
- 초기식; 조건식; 증감식으로 구성되고, 세미콜론으로 구분
- 초기식은 처음 한번만 수행
- 이후 조건식 >> 반복할 문장 >> 증감식이 반복적으로 시행

- 코드 구조

for(초기식; 조건식; 증감식){
	반복할 문장;
}



2. for 문의 상세 동작 방식
- 초기식을 수행
- 조건식 검사
- 조건식의 값이 거짓이면 for 문의 실행 종료
- 조건식의 값이 참이면 문장이 실행
- 증감을 실행하고 조건식 검사로 돌아감

3. for 문의 자주 활용되는 형태

1) for( ; 조건식 ; 증감식) : 빈 초기식

2) for( 변수선언 및 초기화 ; 조건식 ; 증감식)
3) for( 여러개의 초기식(콤마 구분) ; 조건식 ; 증감식)
3) for( 초기식 ; 조건식 ; ) : 빈 증감식
4) for( 여러개의 초기식 ; 조건식 ; 여러개의 증감식)
5) for( 초기식 ; ; 증감식) : 빈 조건식 == 무한 루프

6.5 중첩 반복
- 반복문에서 반복 대상은 어떤문장이든 가능
- 반복문 안에 또 다른 반복문이 오는 경우를 중첩 반복이라 함

6.6 반복문 기타
- 반복문의 실행 상태를 직접 제어하고자 break문과 continue문을 사용한다

1. break문
- 현재 사용중인 반복문을 중단하고 제어를 반복문 바깥으로 이동

2. continue문
- 현재 수행중인 반복문에서 현재 조건 값에 대한 처리를 중단하고, 다음 조건 값에 대한 처리를 수행
- 결과적으로 continue문과 반복문 마지막 부분 사이에 있는 문장은 실행되지 않음

3. 무한 반복
- 일반적으로는 반복문에서는 조건을 지정하여 조건에 맞는 경우에만 반복을 시킴
- 경우에 따라서는 반복이 무한히 지속되는 무한 반복을 사용하는 경우도 있음
- continue문과 break문으로 반복문 중간에 제어를 마음대로 조정 가능
- 남용하면 프로그램의 가독성에 악영향을 줌

방법 1) while 반복문 이용

while(1){
	반복할 문장;
}



방법 2) for 반복문 이용

for( ; ; ){
	반복할 문장;
}



4. 반복문 작성시 강력 권장사항
- break문, continue문, 무한반복을 최대한 사용하지 않고 코딩하라
- 반복문의 형식에 맞추어 코드를 작성하라
- 편한대로 코드를 작성하다보면, 반복 조건이나 반복이 종료된 후에 할 일을 반복문 내부에 작성하는 경우 많음

5. 코딩을 잘하려면
가독성 좋은 코드를 작성해야한다
>> 논리구조가 간단해져서 이해하기 쉽다
>> 코드가 단순해진다
>> 버그생길 가능성도 적고, 디버깅하기도 쉽다
>> 결국 프로그램을 정확하고 빠르게 작성할 수 있다.

728x90
반응형
728x90
반응형

5.1 조건문 개요

1. 제어문
- C언어는 순차처리언어로, 특별한 지정이 없으면, 소스코드 첫 줄부터 차례대로 처리
- 그러나 문제 해결 위해 처리 흐름 제어 필요 >> 제어문
- 따라서 C언어에서는 조건문, 반복문과 같은 제어문 제공

2. 제어문의 종류
조건문 : if 문, if-else 문, switch 문
반복문 : for 문, while 문, do-while 문
기타 : break 문, continue 문, goto 문, return 문

3. 조건문
- 조건에 따라 실행되는 코드가 달라지게 할 떄 사용하는 제어문
if 문, if-else 문, switch 문

5.2 if 문

1. if 문
- 조건식이 참이면 중괄호로 둘러 싸인 블록 안의 문장들이 실행된다.
- 구문

if (조건식){
문장; // 조건식이 참일 때만 실행
} // 블록 안의 문장이 하나인 경우 중괄호 생략 가능


2. 들여쓰기
- 일반적으로 if 문의 조건에 의해 영향을 받는 문장들은 쉽게 구별하기 위해 if 보다 더 들여씀(tab키 사용)
- 이는 가독성을 위한 것일 뿐, 구문에는 전혀 영향 없음

3. if 문 사용시 주의 사항
- if의 조건식 뒤에 바로 세미콜론 ;은 쓰지 않는다
>> 세미콜론을 써도 조건식이 참일 때 아무런 일도 하지 않는 하나의 문장으로 인식
- 조건식에서는 대입 연산자인 = 대신 비교 연산자 == 를 써야 한다.
- 만약 조건식에 대입연산자를 사용하면, 변수에 해당값이 대입되고, 
그 값이 0이면 거짓으로 인식되어 문장이 실행되지 않고, 
0이 아니라 다른 값이면 참으로 인식되어 해당값을 대입한 채로 조건문이 실행된다.

5.3 if-else 문
- if의 조건식이 참이면 조건식 바로 다음의 블록이 실행되고, 
조건식이 거짓이면 else문 다음의 블록이 실행된다
- 구문

if (조건식){
문장1; // 조건식이 참일 때 실행
}
else{
문장2; // 조건식이 거짓일 때 실행
}


5.4 다중 if 문

1. 다중 if문 or 중첩 if문
- if문 안의 문장이 또다른 if문인 경우(if-else문 포함)
- else는 위쪽에서 짝이 없는 가장 가까운 if와 짝이 된다
- else와 멀리있는 if와 짝을 지으려면 중괄호를 사용하여 if문의 적용범위를 지정해 주면 된다.

5.5 switch 문

1. switch 문
- 주로 다중 선택에 사용하는데, 다중 if문 보다 간결
- 대신, 사용 영역이 if-else에 비해 제한적
switch 문 수식의 결과값과 case의 값을 차례로 비교하여 일치하는 case의 문장들부터 차례로 시행

>> 이게 굉장히 주의해야할 점
만약 상위의 case 값이 수식의 값을 만족시킨 경우, 해당 case의 코드를 실행하고,
이후의 case 값과 비교해서 이후의 수식을 실행하는 것이 아니라,
해당 case 값을 만족시키면, 이후의 case값과 상관없이 이후의 모든 코드를 실행한다.

그래서 break 문이 중요하다.
또는 그냥 if 문을 사용하는 것이 낫다.

<형식>

switch(수식){
	case 결과값1:
	// 수식 == 결과값1인 경우 시행
	case 결과값2:
	// 수식 == 결과값2인 경우 시행
	default:
	// 이외의 경우 시행
}



2. switch 문 주의점
case에는 정수형 상수(문자 포함)만 가능
- 부동소수, 수식, 변수, 문자열 안됨

5.6 기타 제어문

 

1. break문
- if, else, else if, switch 문(조건문) 또는 for, while 문(반복문)을 중간에 벗어나는 역할
- 반복문 수행 도중 break문을 만나면 해당 반복문 끝으로 이동

 

2. continue문

- for, while 문(반복문)을 중간에 벗어나 처음으로 돌아가는 역할
- 반복문 수행 도중 continue문을 만나면 반복문 시작으로 이동 및 다시 반복

728x90
반응형
728x90
반응형

4.1 수식과 연산자 개요

1. 연산자
- 데이터를 가공하고 처리하기 위한 가장 기본 도구
- 연산 종류에 따른 분류: 산술 연산자, 관계 연산자, 논리 연산자, 증감 연산자, 비트 연산자, 대입 연산자, 조건 연산자 등
- 피연산자 개수에 따른 분류: 단향 연산자, 이항 연산자, 삼항 연산자

2. 수식
- 피연산자들과 연산자의 조합으로 어떠한 값을 갖는 요소

3. 산술 연산자
+, -, *, /, %
- 정수 연산 >> /: 몫, %: 나머지
- 부동소수 연산 >> /: 나누기

4.. 정수의 자릿수 구하기
- 1의 자릿수 계산
>>>코드

int n = 2715;
printf("일의 자릿수: %d\n", n %10);



- 백의 자릿수 계산
>>>코드

int n = 2715;
printf("백의 자릿수: %d\n", n / 100 % 10);



4.2 산술 연산자

1. 연산 순서
- 연산자 우선 순위: *, /, %는 +, - 보다 먼저 적용
- 적용 순서를 변경하고자 하는 경우 소괄호 사용
- 결합 수칙: 왼쪽에서 오른쪽 방향으로 적용

2. 산술 연산과 자료형
- 연산 결과도 자료형이 먼저 정해져 있어야 함
- 산술연산의 경우 피연산자의 자료형에 따라 연산 결과값의 자료형이 결정됨

예시)
- 정수형과 정수형 => 정수형
- 부동소수형과 부동소수형 => 부동소수형
- 정수형과 부동소수형 => 부동소수형 >> 정보 손실 방지

- 앞의 규칙은 연산자 별로 적용
- 앞의 규칙은 변수에도 동일하게 적용

- 피연산자가 모두 정수형인데, 부동소수 연산을 하고 싶으면 명시적 형변환 사용

4.3 대입 연산자

1. 대입 연산자 =
- 연산자 오른쪽 수식의 값을 왼쪽 변수에 대입(수학의 등호와 다른의미)

2. 연속 대입
- 대입 연산의 결과는 왼쪽 변수에 저장되는 값 >> 이를 이용하여 대입을 연속적으로 진행 가능
예시)

a = b = c = 2; // 해당 문장의 의미는 아래의 코드와 동일하다


>> 오른쪽 부터 수행함의 주의

c = 2;
b = c;
a = b;



3. 복합 대입 연산자: 대입 연산자와 산술 연산자의 결합
- a += x >> a = a + x
- a -= x >> a = a - x
- a *= x >> a = a * x
- a /= x >> a = a / x
- a %= x >> a = a % x

4. 증감 연산자
- 변수의 값을 1씩 증가(++) 혹은 감소(--) 시키는 단항 연산자
- 변수의 앞에 오느냐 뒤에 오느냐에 따라 수식의 해석이 달라진다.
++a : a의 값 1증가 >> a의 값 사용
--a : a의 값 1감소 >> a의 값 사용
a++ : a의 값 사용 >> a의 값 1증가
a-- : a의 값 사용 >> a의 값 1 감소

4.4 관계 연산자
- 왼쪽과 오른쪽의 대소 관계를 비교하는 연산자
- 연산의 결과는 참 아니면 거짓으로, 참이면 1, 거짓이면 0
(C언어에서 0이 아닌 값은 모두 참으로 간주)

- x == y : x의 값과 y의 값이 같다
- x != y : x의 값과 y의 값이 같지 않다
- x < y : x가 y보다 작다
- x > y : x가 y보다 크다
- x <= y : x가 y보다 작거나 같다
- x >= y : x가 y보다 크거나 같다

2. 관계 연산자와 산술 연산자의 우선 순위
- 관계 연산자의 우선순위는 산술 연산보다 낮음
- 산술 계산 먼저 >> 계산된 값 비교

3. 연속된 관계 연산자의 의미
- 4 < 5 < 2 의 경우 C언어에서의 의미
>> (4 < 5) < 2 // 4 < 5의 결과는 참으로 1
>> 1 < 2
>> 1 // 결과는 참

- 만약 수학식 4 < 5 < 2의 의미를 표현하고 싶다면 4 < 5 && 5 < 2 로 표현해야 맞다.

4.5 논리 연산자

1. 논리 연산자
- 논리 연산 값으로 참이면 1이고 거짓이면 0
(0을 제외한 모든 값은 참으로 간주)

!x : 논리 부정(not) >> x가 참이면 거짓(0), x가 거짓이면 참(1)
- x && y : 논리 곱(and) >> x, y 둘다 참이면 참(1), 둘 중 하나라도 거짓이면 거짓(0)
- x || y : 논리 합(or) >> x, y 중 하나라도 참이면 참(1), 둘다 거짓이면 거짓(0)

2. 논리 연산자의 연산 순서
- 우선 순위 : ! > && > || (논리 부정 > 논리 곱 > 논리 합)
- 우선 순위가 같은 경우 왼쪽부터 계산
- 우선 순위를 무시하려면 괄호 사용

3. 논리 연산자와 관계/ 산술 연산자의 우선순위
- && 와 || 의 우선 순위는 관계/ 산술 연산자보다 낮음
- 그러나, ! 의 우선 순위는 관계/ 산술 연산자보다 높음

4.6 그 외 연산자

1. 조건 연산자
- if ~ else 문을 대신하여 사용할 수 있는 연산자
- 피연산자 수가 3개인 삼항 연산자

조건 ? A : B 
>> 조건이 true일 경우, 결과 값은 A
>> 조건이 false일 경우, 결과 값은 B

2. 콤마 연산자: 여러 수식을 하나의 문장으로 표현할 때 사용

a = b+3;
b = 2;
b += a;


>> 하나로 묶기

a = b+3, b = 2, b += a;



3. sizeof 연산자: 저장공간의 크기를 바이트 단위로 계산
- sizeof(char) >>> 결과 값 1
- sizeof(3.14) >>> 결과 값 8
- sizeof(3) >>> 결과 값 4

4. 형변환 연산자: 명시적 형변환을 위해 사용 >> (자료형)

4.7 연산자 우선순위와 결합수칙

1. 연산자 우선순위
- 여러 연산자가 함께 사용된 경우 우선 순위에 의존
- 다른 순서로 연산을 하고 싶은 경우 괄호를 사용

2. 결합 수칙
- 연산의 순서를 나타냄
- 연산자 우선 순위가 같은 경우 결합수칙에 의존

>>> 순위
1) 멤버 연산자 >> (), [], ., -> : 왼쪽 우선
2) 단항 연산자 >> 부호 +, 부호 -, ++, --, !, ~, 간접참조 *, & 주소, sizeof(자료형) : 오른쪽 우선
3) 산술 연산자 >> 곱하기 *, /, % : 왼쪽 우선
4) 산술 연산자 >>더하기 +, 뺴기 - : 왼쪽 우선
5) 이동 연산자 >> <<, >> : 왼쪽 우선
6) 관계 연산자 >> <, >, <=, >= : 왼쪽 우선
7) 관계 연산자 >> ==, != : 왼쪽 우선
8) 논리 연산자 >> 비트곱 & : 왼쪽 우선
9) 논리 연산자 >> ^ : 왼쪽 우선
10) 논리 연산자 >> | : 왼쪽 우선
11) 논리 연산자 >> && : 왼쪽 우선
12) 논리 연산자 >> || : 왼쪽 우선
13) 조건 연산자 >> ? : 오른쪽 우선
14) 대입 연산자 >> =, +=, -=, *=, %=, /=, ^=, <<=, >>= : 오른쪽 우선
15) 콤마 연산자 >> , : 왼쪽 우선

3. 주요 연산자 우선순위
- 산술 >> 관계 >> 논리 >> 대입 연산 순

728x90
반응형
728x90
반응형

변수와 자료형

2.1 변수와 자료형 개요

1. 변수, 자료형, 상수
1) 변수: 값을 담을 그릇
- 값을 저장하기위한 기억 장소
- 사용하기 전에 반드시 선언

2) 자료형: 그릇의 모양
- 자료값의 형태
- 컴퓨터 내부에서 값이 저장되고 처리되는 방식을 결정짓는 매우 중요한 요소

3) 상수
- 변하지 않는 수로 변수와 대비되는 개념
- 10, 20, 30 과 같은 특정 값

2. 2 변수 선언과 사용

1. 변수 선언:  int n;
- 자료형을 앞에 명시 한 후 사용할 변수 이름을 적음
- 변수 선언도 하나의 문장이므로 세미콜론을 붙여야 함

2. 다양한 변수선언의 예시
1) 가능

int a;
double b;



2) 가능

int a, b;
double c, d;



3) 불가능

int a, double b;



3. 변수 값 저장
- 선언된 변수에 값을 저장하기 위해 대입연산자 '=' 사용
- 왼쪽 변수에 오른쪽의 값을 대입(저장)하라는 의미
- 변수에 새로운 값을 대입하면 이전값은 사라짐

>>>코드 예시

int age = 20;



4. 대입 연산자
- 대입 연산자 왼쪽: 저장공간 자체
- 대입 연산자 오른쪽: 저장된 값

5. 변수 초기화
- 변수를 선언만 하고 값을 대입하지 않으면 쓰레기 값(garbage value)가 저장되어 있음
- 선언과 동시에 변수 값 지정(변수 초기화)
>>> 예시

int num = 123;


- 여러변수 동시 초기화 가능, 일부 변수만 초기화 가능
>>> 예시

int a = 123, b = 456, c = 789;



6. 키워드와 식별자

1) 키워드
- C언어에서 특별한 의미를 가지도록 미리 정해놓은 단어
- 예) char, int, double등 기본 자료형 등등

2) 식별자
- 변수처럼 프로그래머가 지어서 사용하는 이름
- 식별자로 사용할 수 없는 이름의 예 : 밑줄이 아닌 특수문자, 첫 문자에 숫자, 키워드

2.3 정수 자료형

1. 정수 자료형 종류
- 2, 3, 5와 같이 정수를 표현하는 자료형
- 정수형 키워드: 

short(2 bytes) 

<= int(4 bytes) 

<= long(4 bytes) 

<= long long(8 bytes)

- int: 정수를 나타내는 가장 기본적인 자료형
- short, long, long long: 정수를 나타내지만 자료형의 크기가 다름
- 정수형 출력: printf의 서식 지정자 '%d' 사용

- 같은 자료형이라도 시스템에 따라 크기가 다를 수 있음
- 자료형의 크기는 sizeif()연산자를 이용하여 확인
- 자료형의 크기는 표현 할 수 있는 수의 범위 결정
>>> int의 크기는 보통 4byte(32bit)로서 2^(32)개의 수 표현 가능
따라서 -2^(31) ~ 2^(31) -1 사이의 정수를 나타냄(0, 음수, 양수)

2. signed와 unsigned

1) signed: 음수와 양수 모두 표현
2) unsigned: 0과 양수만 표현(음수X)
>>> 자료형 앞에 부호여부 명시해 주면 된다.(명시하지 않으면 기본적으로 signed)

2.4  부동소수 자료형

1. 부동소수(floating point) 형 종류
- 3.14, 3.26567와 같이 실수를 표현하는 자료형
- 자료형 키워드: 
float(4 bytes, 유효 자릿수 약 7개) 

<= double(8 bytes, 유효 자릿수 약 16개) 

<= long double(8 bytes, 유효 자릿수 약 16개)

- double: 부동소수를 나타내는 가장 기본적인 자료형
- float, long double: 부동소수를 나타내지만 자료형의 크기가 다름 
- 부동소수형 출력: printf의 서식 지정자 '%f' 사용

2. 부동소수형의 표현 방식
- 0.000023의 다른 표현 >>> 2.3 * 10^(-5)
- 컴퓨터 내부에선 후자의 방식으로 표현
- 컴퓨터에서 정수 3과 부동소수 3.0은 전혀 다름

2.5 문자 자료형

1. 문자형
char: 문자형을 나타내는 가장 기본적인 자료형
- 문자형 자료형의 크기는 모두 1byte
- 문자는 작은 따옴표를 사용하여 표현
- 문자형 출력: printf의 서식 지정자 '%c' 사용

2. 문자형의 실체
특정 문자에 해당하는 정수값을 지정아스키(ASCII) 코드
- 문자형은 본질적으로 정수형과 동일

- 알아두면 좋은 아스키 코드
- "A": 65
- "a": 97
- "0": 48

>>>코드 예시
char c1 = 'A';
char c2 = 65;
printf("c1: %c %d\n", c1, c1);
printf("c2: %c %d\n", c2, c2);

>>>결과
c1: A 65
c2: A 65

3. 문자형은 본질적으로 정수(1byte)
- 정수 연산 가능: 'A' +1 == 'B'
- 부호 없는 자료형 가능: unsigned char
char: 1byte(8bits): -128~127
unsigned char: 1byte(8bits): 0~255

4. 문자 '0'과 숫자 0은 다르다
문자 '0'의 아스키 코드 값은 48

5. 특수 문자(이스케이프 시퀸스)
- \n: 새로운 줄로 이동(Enter)
- \t: 다음 탭으로 이동(tab)
- \b: 앞으로 한칸 이동(Back Space)
- \r: 줄의 맨 앞으로 이동(home)
- \a: '삑' 소리를 냄
- \\: 역슬래쉬
- \': 작은 따옴표'
\": 큰 따옴표"
- %%: 퍼센트 %

2.6 자료형 변환

1. 자동 형변환(묵시적 형변환)
- 정수 >>> 부동소수

int a = 3;
double b = a;


>>> 결과

b = 3.0 // 소수점 아래자리는 .00000으로 변환



- 부동소수 >>> 정수

double a = 3.14;
int b = a;


>>> 결과

b = 3 // 소수점 아래자리는 소실되고 정수만 남음



2. 명시적 형변환
- printf의 서식 지정자에 따라 형변환이 자동으로 발생하지 않음 >>> 명시적 형변환 필요
>>> 예시

printf("12.3: %d\n", (int) 12.3);
printf("123: %f\n", (double) 123);


>>> 결과
12.3: 12
123: 123.000000

728x90
반응형

+ Recent posts