공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
함수
- 함수 정의
- main 함수의 return문
- 주석
변수
- 변수 구성
* 변수 선언 시 주의사항
* C언어의 표준 키워드 - 쓰레기 값
연산자
- 단항 연산자
- 증가, 감소 연산자
- 이항 연산자
- 비트 연산자
- 복합 대입 연산자
- 관계 연산자(비교 연산자)
- 논리 연산자
- 콤마(,) 연산자
- 연산자의 우선순위와 결합 방향
컴파일(compile) : 프로그래밍 언어를 기계어로 번역하는 과정
함수(function)
특정 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합을 함수라고 한다. C언어로 만들어진 프로그램은 모두 하나이상의 함수로 구성되어 있다.
[반환형] [함수 이름] ([매개변수])
{
[함수의 몸체]
}
- 반환형(return type) : 함수를 실행하고 난 뒤 반환하는 값의 자료형을 입력
- 함수 이름 : 함수의 이름 지정
- 매개변수(인자, parameter) : 함수의 입력값, ``자료형 변수이름`` 으로 구성된다.
여러 개일 경우 쉼표`` , ``로 구분 - 함수의 몸체 : 함수가 호출될 경우 실행될 명령어들을 지정
모든 문장의 끝에는 세미콜론@@ ; @@을 붙여준다. - return문(반환형이 있을 경우) : 함수를 호출한 영역으로 값을 전달하고 현재 실행 중인 함수를 종료한다.
main 함수의 return문
``main``함수는 운영체제(Windows나 Linux 등)에 의해 프로그램이 시작되면 자동으로 호출된다. 그래서 ``main`` 함수의 ``return`` 값은 운영체제에게 전달되며 프로그램의 종료 상태를 알리는 용도로 사용된다.
- 0 : 정상적인 종료의 상황에서 전달하는 값
- 0이 아닌 값 : 비정상적인 상황으로 인해 종료될 때 전달하는 값
주석(comment)
프로그램 내에 삽입된 메모이다. 컴파일의 대상에서 제외되기 때문에 프로그램의 실행 결과에 영향을 미치지 않는다.
주석종류 | 형 태 | 설 명 |
행 단위 주석 | // [주석처리 된 문장] | 한 줄을 주석처리할 때 사용 |
블록 단위 주석 | /* [주석처리 된 문장] */ |
한 줄 이상을 주석처리할 때 사용 (중첩해서 사용할 수 없다. 내부에 주석을 또 사용해야 할 경우 행 단위 주석을 사용해야 함) |
변수(variable)
값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 변수라 한다.
[자료형] [변수 이름] = [초기 값];
- 자료형 : 변수의 자료형을 지정
ex) ##int## : 정수 저장이 가능한 메모리 공간 할당 - 변수 이름 : 변수의 이름을 지정
- `` = `` : 대입 연산자, `` = ``를 기준으로 오른쪽의 값을 왼쪽 변수에 저장한다.
- 초기값
: 선언된 변수에 처음 값을 저장하는 것을 초기화라고 하는데 초기값을 지정해서 선언하면 '선언과 동시에 초기화'한다고 한다. 초기화 이후에 저장된 값을 변경하는 것은 대입 or 대입 연산이라고 한다.
변수 선언 시 주의사항
- `` { } `` 내에 변수를 선언할 경우, 변수의 선언문은 중괄호의 앞부분에 위치해야 한다.
- 변수 이름은 알파벳, 숫자, 언더바(`` _ ``)로 구성됨
- C언어는 대소문자를 구별한다.
- 변수 이름은 숫자로 시작할 수없고, 키워드도 변수의 이름으로 사용할 수 X
- 이름 사이에 공백 삽입 불가
C언어의 표준 키워드(Keyword) : 기능적 의미가 정해져서 C언어의 문법을 구성하는 단어. 변수나 함수의 이름으로 사용할 수 없다. 프로그래머가 다른 용도로 사용할 수 없도록 제한되어 있다. ``auto`` ``_Bool`` ``break`` ``case`` ``char`` ``_Complex`` ``const`` ``continue`` ``default`` ``do`` ``double`` ``else`` ``enum`` ``extern`` ``float`` ``for`` ``goto`` ``if`` ``_Imaginary`` ``return`` ``restrict`` ``short`` ``signed`` ``sizeof`` ``static`` ``struct`` ``switch`` ``typedef`` ``union`` ``unsigned`` ``void`` ``volatile`` ``while`` |
쓰레기 값
#include <stdio.h>
int main(void)
{
int num1, num2; // 변수 num1, num2 선언
int num3 = 30, num4 = 40; // 변수 num3, num4 선언 및 초기화
printf("num1 : %d, num2 : %d \n", num1, num2);
num1 = 10; // num1 초기화
num2 = 20; // num2 초기화
printf("num1 : %d, num2 : %d \n", num1, num2);
printf("num3 : %d, num4 : %d \n", num3, num4);
return 0;
}
첫 번째 ``printf``문에서 ``num1``, ``num2``에 아무런 값을 저장하지 않았는데 ``0``과 ``38``이 출력되는 것을 확인할 수 있다. (컴퓨터마다 값은 다를 수 있음) 이런 값들을 쓰레기 값이라고 한다. 이처럼 변수를 선언만 하고 초기화하지 않은 상태로 값을 불러오면 쓰레기 값을 출력하기 때문에 변수를 선언하고 값을 불러올 때 주의해야 한다.
연산자
1. 단항 연산자
`` + ``, `` - ``가 피연산자가 하나인 단항 연산자로 사용되면 부호를 뜻하기도 한다.
2. 증가, 감소 연산자
단항 연산자이며 변수에 저장된 값을 1 증가 및 감소시키는 경우에 사용되는 연산자이다.
종 류 | 연산자 | 연산자의 기능 | 결합방향 |
전위 (prefix) 연산자 | ++num | 값을 1 증가시킨 후, 속한 문장의 나머지를 진행(선 증가, 후 연산) | ← |
--num | 값을 1 감소시킨 후, 속한 문장의 나머지를 진행(선 감소, 후 연산) | ← | |
후위 (postfix) 연산자 | num++ | 속한 문장을 먼저 진행한 후, 값을 1 증가시킴(선 연산, 후 증가) | → |
num-- | 속한 문장을 먼저 진행한 후, 값을 1 감소시킴(선 연산, 후 감소) | → |
#include <stdio.h>
int main(void)
{
int num1 = 10;
int num2 = 10;
int num3 = (num1--) + 2;
printf("num1 : %d \n", num1);
printf("num1++ : %d \n", num1++); // 후위 증가
printf("num1 : %d \n", num1);
printf("\nnum2 : %d \n", num2);
printf("++num2 : %d \n", ++num2); // 전위 증가
printf("num2 : %d \n", num2);
printf("\nnum3 : %d\n", num3);
}
전위 연산자와 후위 연산자의 차이를 비교해보는 예제이다.
후위 연산자(후위 증가, 후위 감소)는 ``( )``의 영향을 받지 않고, 다음 문장으로 넘어가야만 값의 증가 및 감소가 이뤄지는 것을 확인할 수 있다.
3. 이항 연산자(binary operator)
두 개의 피연산자를 요구하는 연산자를 가리켜 이항 연산자라고 한다.
연산자 | 연산자의 기능 | 결합방향 |
= | 오른쪽에 있는 값을 왼쪽 변수에 대입 | ← |
+ | 두 피연산자의 값을 더함 | → |
- | 왼쪽 피연산자 값에서 오른쪽 피연산자 값을 뺌 | → |
* | 두 피연산자의 값을 곱함 | → |
/ | 왼쪽 피연산자 값을 오른쪽의 피연산자 값으로 나눔 | → |
% | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게되는 나머지를 반환 | → |
4. 비트 연산자
비트단위로 연산을 하는 연산자를 의미한다. 보통 ##>>1## 하면 값을 ##2##로 나눈 것과 같고 ##<<1##하면 값을 두 배한 것과 같기 때문에 상황에 따라서 곱셈과 나눗셈을 비트 이동 연산으로 대체할 수 있다.
연산자 | 연산자의 기능 | 결합방향 |
& | 비트 단위로 AND 연산 ex) num1 & num2 |
→ |
| | 비트 단위로 OR 연산 ex) num1 | num2 |
→ |
^ | 비트 단위로 XOR 연산 ex) num1 ^ num2 |
→ |
~ | 단항 연산자로서 피연산자의 모든 비트를 반전시킨다. ex) ~num1 |
← |
<< | 피연산자의 비트 열을 왼쪽으로 이동시킴 ex) num1 << 2 : 두 칸만큼 왼쪽으로 이동 |
→ |
>> | 피연산자의 비트 열을 오른쪽으로 이동시킴 ex) num1 >> num2 : num2칸만큼 오른쪽으로 이동 |
→ |
#include <stdio.h>
int main(void)
{
int num1 = 15; // 00000000 00000000 00000000 00001111
int num2 = 20; // 00000000 00000000 00000000 00010100
printf("AND 연산의 결과 : %d\n", num1 & num2);
printf("OR 연산의 결과 : %d\n", num1 | num2);
printf("XOR 연산의 결과 : %d\n", num1 ^ num2);
printf("NOT 연산의 결과(~num1) : %d\n", ~num1);
printf("\nnum1 << 1 결과 : %d\n", num1 << 1);
printf("num1 << 2 결과 : %d\n", num1 << 2);
printf("num1 << 3 결과 : %d\n", num1 << 3);
printf("\nnum1 >> 1 결과 : %d\n", num1 >> 1);
printf("num1 >> 2 결과 : %d\n", num1 >> 2);
printf("num1 >> 3 결과 : %d\n", num1 >> 3);
return 0;
}
비트 연산자를 확인해보는 예제이다.
5. 복합 대입 연산자
다른 연산자와 합쳐진 형태의 대입 연산자를 복합 대입 연산자라고 한다.
연산자 | 의미 | 설명 |
+= | ex) a += b a = a + b |
더한 값을 다시 자신에게 저장 |
-= | ex) a -= b a = a - b |
뺀 값을 다시 자신에게 저장 |
*= | ex) a *= b a = a * b |
곱한 값을 다시 자신에게 저장 |
/= | ex) a /= b a = a / b |
나눈 값을 다시 자신에게 저장 |
%= | ex) a %= b a = a % b |
나눈 나머지 값을 다시 자신에게 저장 |
<<= | ex) a <<= b a = a << b |
왼쪽으로 비트이동 한 값을 다시 자신에게 저장 |
>>= | ex) a >>= b a = a >> b |
오른쪽으로 비트이동 한 값을 다시 자신에게 저장 |
&= | ex) a &= b a = a & b |
AND 연산한 값을 다시 자신에게 저장 |
^= | ex) a ^= b a = a ^ b |
XOR 연산한 값을 다시 자신에게 저장 |
|= | ex) a |= b a = a | b |
OR 연산한 값을 다시 자신에게 저장 |
6. 관계 연산자(비교 연산자)
관계 연산자는 대소와 동등의 관계를 따지는 연산자이다.
아래의 연산자들은 조건을 만족하면 ``1``(참, true)을, 만족하지 않으면 @@0@@(거짓, false)을 반환한다.
연산자 | 연산자의 기능 | 결합방향 |
< | ex) n1 < n2 n1이 n2보다 작은가? |
→ |
> | ex) n1 > n2 n1이 n2보다 큰가? |
→ |
== | ex) n1 == n2 n1이 n2와 같은가? |
→ |
!= | ex) n1 != n2 n1이 n2와 다른가?(같지 않은가?) |
→ |
<= | ex) n1 <= n2 n1이 n2보다 작거나 같은가? |
→ |
>= | ex) n1 >= n2 n1이 n2보다 크거나 같은가? |
→ |
7. 논리 연산자
논리 연산자란 ``AND``(논리곱), ``OR``(논리합), ``NOT``(논리 부정)을 표현하는 연산자이다.
연산자 | 연산자의 기능 | 결합방향 |
&& | ex) A && B A와 B모두 '참'이면 연산결과로 '참'을 반환(논리 AND) |
→ |
|| | ex) A || B A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR) |
→ |
! | ex) !A A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT) |
← |
8. 콤마 연산자(,)
둘 이상의 변수를 동시에 선언하거나, 둘 이상의 문장을 한 행(line)에 삽입하는 경우에 사용되는 연산자이다. 다른 연산자 들과 달리, 연산의 ``결과``가 아닌 '구분'을 목적으로 주로 사용된다.
■ 연산자의 우선순위와 결합방향
- 결합방향 : 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것
순위 | 연산기호 | 연산자 | 결합방향 |
1순위 |
( ) | 함수호출 | → |
[ ] | 인덱스 (배열 첨자) | ||
-> | 간접지정 (포인터로 구조체 / 공용체 멤버 접근) | ||
. | 직접지정 (구조체 / 공용체 멤버 접근) | ||
++ (postfix) -- (postfix) |
후위증가 및 감소 | ||
(자료형){값} | 복합 리터럴 | ||
2위 | ++ (prefix) -- (prefix) |
전위증가 및 감소 | ← |
sizeof | 바이트 단위 크기 계산 | ||
~ | 비트 단위 NOT | ||
! | 논리 NOT | ||
-, + | 부호 연산(양수, 음수 표현) | ||
& | 주소 연산 | ||
* | 간접지정 연산 (포인터 역참조) | ||
3위 | (casting) | 자료형 변환 | ← |
4위 | *, /, % | 곱셈, 나눗셈 관련 연산 | → |
5위 | +, - | 덧셈, 뺄셈 | → |
6위 | <<, >> | 비트이동 (시프트 연산) | → |
7위 | <, >, <=, >= | 대소비교 | → |
8위 | ==, != | 동등비교 | → |
9위 | & | 비트 AND | → |
10위 | ^ | 비트 XOR | → |
11위 | | | 비트 OR | → |
12위 | && | 논리 AND | → |
13위 | || | 논리 OR | → |
14위 | ? : | 조건연산 (삼항 연산자) | ← |
15위 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= |
대입연산 | ← |
16위 | , | 쉼표(콤마) 연산 | → |
'기타 > C' 카테고리의 다른 글
[C] 함수 (0) | 2020.04.27 |
---|---|
[C] 조건문, 반복문 (0) | 2020.04.16 |
[C] printf, scanf 함수 (0) | 2020.04.09 |
[C] 자료형 변환 (0) | 2020.04.08 |
[C] 데이터 표현 방식, 기본 자료형과 상수 (0) | 2020.04.07 |