Without a Break

C언어에 대한 이해 본문

Algorithm/컴퓨터알고리즘

C언어에 대한 이해

와븨 2022. 9. 28. 01:23

C 프로그램 구조

  • 한 개 이상의 함수들로 구성
  • 함수몸체 : 중괄호 { }
  • 화이트 스페이스(white space) 삽입 : 변수나 값, 키워드를 억지로 분절시키지 않는 이상, 빈 줄이나 빈 칸, 탭과 같은 공백을 마음대로 넣는 것을 허용하는 것
  • 각 함수들 사이에 들여쓰기를 사용하여 소스코드의 가독력 향상 => 통합개발환경(IDE)에서는 들여쓰기 실수로 인한 오해 유발을 막기 위해 시스템이 자동으로 들여쓰기 진행
  • C언어는 전달하고 전달받는 변수나 값의 데이터 타입이 서로 일치하는지 번역 단계에서 미리 점검하여 오류를 줄이는 특징을 가짐

 

C 문장

  • 든 C 문장은 세미콜론(;)으로 종료
  • 문장의 끝에 세미콜론을 붙인다면 한 줄에 여러 C 문장을 쓰는 것도 가능
  • 콤마(,) 연산자를 통해 C문장을 나열형으로 변형하여 한 개의 문장으로 표현할 수 있음 => 반복 선언
  • 콤마 연산자는 콤마 좌우에 있는 구성요소 문장들을 왼쪽부터 오른쪽으로 순서대로 계산을 진행 -> 맨 마지막 결과 값을 최종 값으로 사용
  • 변수형(data type)을 선언하는 C문장은 계산을 진행하는 문장이 아니므로 반복 선언 불가능
//일반 코드
A = 10;
B = 25;
SUM = A + B;

//세미콜론을 사용해 한 줄에 여러 C문장 작성
A = 10; B = 25; SUM = A + B;

//콤마 연산자를 사용해 한 줄에 C문장을 나열형으로 변형
A = 10, B = 25, SUM = A + B;

//변수형(data type)을 선언하는 C문장은 반복 선언 불가
int SUM, int A, int B; //오류 발생

//같은 데이터 타입으로 변수형 선언은 가능
int SUM, A, B;

 

main 함수

  • main 함수로부터 C프로그램이 시작하고 종료 => main 함수는 유일하게 존재해야 함
  • main()로 표기
  • 시스템에 의하여 최초로 호출되는 특별한 함수
  • 괄호 안에 2개의 매개변수 argc와 argv는 main() 함수가 시스템으로부터 넘겨받는 입력 값이 모두 몇 개인지, 각각의 입력 값들이 무엇인지 인수인계 받기 위한 것
  • 시스템으로부터 넘겨받는 입력 값이 없음을 강조하기 위하여 main(void)로 표현하기도 함

 

파라미터(parameter) / 매개변수

  • 자신을 호출한 곳으로부터 어떤 값을 입력으로 전달 받아 작업을 진행한 후 그 결과 값을 반환하게 되는데, 이 때 전달받을 입력을 보관할 변수

 

return문

  • 자신을 호출한 함수에게 결과 값을 반환할 때 사용
  • 반환할 결과 값이 없는 경우, 함수 몸체 중에 return 문은 나타나지 않음
  • 함수가 return할 결과 값의 데이터 타입(자료형)을 함수이름 앞에 명시해주어야 함
  • 함수라 return할 값이 없다면 함수 이름 앞에 void라는 특별한 데이터 값을 명시함 (비어있다는 뜻)

 

 

전처리기

  • C 프로그램에서 자주 상요하는 함수들은 일반 사용자가 매번 반복하여 작성하지 않도록 미리 정의해놓은 C 소스의 경로를 자신의 프로그램 안에 명시하여야 함
  • 전처리기 : 컴파일러가 사용자가 작성한 C 프로그램 소스 코드를 컴파일하기 직전에, 시스템이 제공하는 소스 코드를 미리 포함한 후 컴파일 전 사전 작업을 처리해 주는 시스템 프로그램
  • main() 함수 앞에 #으로 시작한느 문장을 사용하면 프로그래머가 전처리기에 무엇을 먼저 해야 할지 알려줄 수 있다
  • #으로 시작된 문장은 무조건 줄 단위로 구분되므로 세미콜론(;)이 필요 없음
  • #include <stdio.h> = 표준 입출력. 이때, <>안에 있는 파일을 헤더(header) 파일이라고 함
  • stdio.h 파일에는 printf(), scanf(), getc(), getchar(), putc(), getw(), putw(), fgets(), fputc() 등이 다양한 입출력 함수들이 정의되어 있음

 

 

변수 선언

데이터_타입 변수명;
  • 사용하고자 하는 변수는 사용하기 전에 미리 어떤 데이터 타입(자료형)을 보관하는 변수인지 선언해야 함
  • 변수명에서 대문자와 소문자는 서로 다른 문자로 간주
  • 변수를 선언함과 동시에 초깃값을 바로 설정 가능. ex) int a = 10;
  • C 언어에서 자주 사용하는 "기본 데이터 타입"

기본 데이터 타입

 

 

 

배열변수와 포인터

배열 변수와 포인터

데이터_타입 배열변수명[배열크기];
  • 배열변수 : 값들을 기억장소 안에 연속하여 보관하는 장소 => 연속적인 기억장소에 보관됨
  • 배열변수는 미리 보관할 데이터 타입을 선언하고 적절한 때 필요한 공간을 배정받아야 함
  • 배열변수도 사용 전에 먼저 변수 선언을 한 후 사용해야 함
  • 배열의 각 원소를 접근할 때는 배열이름 뒤, 대괄호 사이에 인덱스 번호를 넣음 => C언어에서 배열 인덱스는 0부터 시작하여 (배열크기 -1)까지 할당
  • 포인터 타입 : '배열이름'은 첫 번째 배열원소에 대한 기억장소 주소 값을 보관. 이 때, 주소 값을 보관하는 변수
  • & : 연산자 가운데서 변수의 주소 값을 계산해주는 연산자. ex) &VAL[0]은 배열변수 VAL의 첫 번째 배열원소 VAL[0]에 대한 주소 값을 계산하도록 하므로, VAL과 &VAL[0]은 동일한 표현

 

2차원 배열

데이터_타입 배열변수명[행크기][열크기]
  • 배열들의 배열
  • ex) float SCORE[3][4];
  • 이런 식으로 배열을 구조화하면, 3차원, 4차원 배열선언도 가능해짐

 

 

수식연산자

산술연산자

연산자 표현수식 의미
+ A+B 변수 A와 B에 저장된 값을 더한다
- A-B 변수 A에서 B에 저장된 값을 뺀다
* A*B 변수 A와 B에 저장된 값을 곱한다
/ A/B 변수 A의 값을 B에 저장된 값으로 나눈다
% A%B 변수 A에 저장된 값을 B에 저장된 값으로 나눈 나머지이다

 

증감연산자

  • 증감 연산자가 변수의 '앞'에 붙는 경우 : 증감을 먼저 시키고 변수 값을 사용
  • 증감 연산자가 변수의 '뒤'에 붙는 경우 : 현재 변수의 값을 필요로 한느 곳에 먼저 제공하여 사용하게 한 후 증감 연산을 나중에 실시
연산자 표현 수식 의미
++ A++; 변수 A에 저장된 값을 1만큼 증가 (A = A +1;)
++A; 변수 A에 저장된 값을 1만큼 증가 (A = A +1;)
-- A--; 변수 A에 저장된 값을 1만큼 감소 (A = A -1;)
--A; 변수 A에 저장된 값을 1만큼 감소 (A = A -1;)

 

 

배정 연산자

  • 변수에 어떤 값을 저장할 때 사용한다
연산자 표현 수식 의미
= A = 10; 변수 A에 10을 배정한다
A = B= 10; B = 10; A = B; 와 동일하다
즉, 변수 B에 10을 배정한 후, 변수 A에 변수 B의 값을 배정한다.
오른쪽부터 왼쪽으로 배정(=)이 이루어진다.
+= A += 10; A = A + 10;과 동일하다
-= A -= 10; A = A - 10;과 동일하다
*= A *= 10; A = A * 10;과 동일하다
/= A /= 10; A = A / 10;과 동일하다
%= A %= 10; A = A % 10;과 동일하다

 

 

관계 연산자

  • 두 수 간에 관계를 비교하는 데 사용
  • 관계가 성립하면 (참,true) 1을, 성립하지 않으면 (거짓,false) 0을 결과 값으로 생성
연산자 표현 수식 의미
> A > B A에 저장된 값이 B에 저장된 값보다 큰가?
>= A >= B A에 저장된 값이 B에 저장된 값보다 크거나 같은가?
< A < B A에 저장된 값이 B에 저장된 값보다 작은가?
<= A <= B A에 저장된 값이 B에 저장된 값보다 작거나 같은가?
== A == B A에 저장된 값이 B에 저장된 값과 같은가?
!= A != B A에 저장된 값이 B에 저장된 값과 다른가?

 

논리 연산자

  • AND (논리곱) : 하나라도 0이면 결과는 0, &&연산자
  • OR (논리합) : 하나라도 1이면 결과는 1, ||연산자
  • NOT (부정) : 논리 연산을 수행하는 데 사용, !연산자
변수 A의 값 변수 B의 값 A && B A || B ! A
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

 

조건 연산자

  • ?:
  • 3개의 값을 받아서 첫 번째 값이 참(1)이면 두 번째 값을, 첫 번째 값이 거짓(0)이면 세 번째 값을 결과 값으로 설정
연산자 표현 수식 의미
? : A ? B : C A가 참이면 B를, 거짓이면 C를 결과 값으로 설정

 

타입변환 연산자

  • 데이터 타입을 강제로 바꿀 때 사용하는 연산자
  • 괄호 사이에 바꾸고 싶은 데이터 타입을 명시
  • 캐스트(cast) 연산자라고도 부름
  • C 언어에서는 상이한 데이터 타입의 값들을 혼용하면 정확도가 높은 쪽으로 타입 변환이 자동으로 일어남 => 이 때, 사용자가 강제로 변환하고 싶으면 타입변환 연산자 사용
float A;
int B,C;

A = 1.3;
B = 2;
C = (int)(A * B); //강제 타입변환

 

 

입출력함수

printf()

printf("출력 형식", 출력 대상);
  • 큰 따옴표 사이에 있는 내용은 화면에 그대로 출력된다. 다만, 출력 형식 안에 특별한 기호(\와 %)는 그대로 출력되지 않고 다른 의미로 해석

 

printf() 입출력함수 구분

  • 타입지정(%)에서 자릿수까지도 지정 가능
확장문자(\) \n 줄 바꿈
\t 공백 8개(탭) 출력
\" 끝 따옴표(") 출력
\b 커설르 한 문자 앞으로 이동
\\ 백슬래시(\) 출력
타입지정(%) %d 해당 출력 대상을 10진수로 출력
%f 해당 출력 대상을 실수로 출력
%c 해당 출력 대상을 문자로 출력
%x 해당 출력 대상을 16진수로 출력
%o 해당 출력 대상을 8진수로 출력

 

scanf()

scanf("입력 형식", 입력 대상);
  • 큰 따옴표 사이에 있는 내용에는 뒤에 오는 입력 대사에 대한 타입 지정이 %를 사용하여 이루어짐

 

scanf() 입출력함수 구분

  • 입력 대상에서 변수 이름 앞에 &(주소 연산자)를 붙임 => 읽어 들인 데이터를 해당 주소가 가리키는 기억 장소에 저장하도록 하기 위함
  • scanf()에 의하여 데이터를 입력받을 경우 마지막에 Enter키를 눌러야 입력 완성
타입지정(%) %d 해당 입력 대상을 10진수로 입력
%f 해당 입력 대상을 float 타입 실수로 입력
%lf 해당 입력 대상을 long 타입 실수로 입력
%c 해당 입력 대상을 문자로 입력
%x 해당 입력 대상을 16진수로 입력
%o 해당 입력 대상을 8진수로 입력

 

 

주석

주석 표현 주석
/* 주석부분 */ - /* 부터 시작하여 */ 까지의 부분이 주석
- 주석부분은 여러 줄에 걸쳐 작성되어도 상관 없음
// 주석부분 - 줄 단위 주석으로서 줄 맨 앞에 //를 삽입
- 여러 줄을 주석으로 할 경우, 줄마다 맨 앞에 //를 각각 삽입해야 함

 

 

반복구조

  • 조건식에 아무것도 명시되어 있지 않거나 1(참)로 명시되어 있으면, 무조건 반복에 해당되어 무한반복 => break문 사용하여 반복구문 벗어날 수 있음
  • 조건식이 0(거짓)으로 명시되어 있으면, 조건을 만족하지 못하므로 바로 종료
  • for 구문은 반복할 횟수가 정해진 경우에 사용하며, while 구문이나 do while 구문은 횟수보다는 조건을 중심으로 반복 여부를 결정하는 경우 사용

 

for문

  • 초기식 수행 -> 조건식 점검 참인 경우에만 반복 문장 수행 -> 증감식 수행 후 다시 조건식 점검해 참인 경우 반복
  • 만일 처음부터 조건식이 참이 아니면 반복할 문장은 한 번도 수행되지 않음

while문

  • 조건식이 참인 경우에만 반복할 문장을 수행
  • 처음부터 조건식이 참이 아닐 경우, 반복할 문장은 한 번도 수행되지 않음

do-while문

  • 반복할 문장을 무조건 먼저 수행한 후, 조건식이 참인 경우에만 다시 반복
  • 마지막 끝에 세미콜론(;)을 붙임

 

 

조건분기구조

  • C 언어에서는 조건에 따라 프로그램을 수행할 영역을 달리하는 조건분기구조 제공
  • if, else, else if와 switch{case ... default}

 

 

흐름변경 문장

흐름변경용 C 문장 해석
break; 반복구문 안에서 반복을 중단
continue; 반복구문 안에서 반복을 아예 중단하지 않고 이 시점부터 다음 반복으로 넘어갈 때 사용
goto label; label: 로 명시된 곳으로 프로그램 흐름을 강제로 바꿈