이번에는 C언어의 변수와 연산자에 대해 간단히 알아 보겠습니다.



1. 변수와 연산자


연산자 : + - x / 처럼 특정연산을 요구할 때 사용하는 약속된 기호 입니다.


변수 : 특정 연산의 결과나 특정 값을 저장하기 위해 사용되는 것이 변수 입니다.


변수를 선언한다는 것은 메모리 공간을 할당한다는 말이에요! (메모리 할당에 대해서는 추후 포인터를 다루면서 다시 설명 하도록 하겠습니다.)


변수 선언과 연산자를 사용한 결과를 출력한 간단한 예제를 보도록 하겠습니다.



int 라는 것은 조금 후에 추가적으로 설명을 드리도록 하고, 5 번째 줄의 int num1 = 3; 을 보시면 num1 = 3.

이 말은 num1 이라는 변수를 선언 해주고, num1이라는 변수에 3이라는 값을 저장 한다는 의미입니다.


11번째 줄의 printf() 함수를 사용하여 출력한 결과를 보면 num1이라는 변수에 저장 되어진 3이라는 값이 정상적으로 출력 되는 것을 확인 가능합니다.


또한 7번째 줄에서 연산자를 활용하여 num1과 num2에 저장 되어 있는 값을 연산하여 나온 결과 값을 result라는 변수에 저장 합니다.


result 값도 9번째 줄에서 출력을 해보게 되면 num1과 num2의 값이 연산이 되어진 후에 나온 결과 값이 출력되는 것을 알 수 있습니다.


* 변수 선언시 초기화를 해주지 않으면 쓰레기 값이 출력 되거나, 에러가 발생합니다 ! (초기화 해주는 것은 변수를 선언하자마자 처음 값을 넣어 주는 것을 말합니다.)




2. 변수의 이름 규칙 : 변수의 이름을 선언 할 때는 지켜야 할 규칙이 있습니다. 이것을 변수의 이름 규칙이라 합니다.

- 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성됩니다.

- C언어는 대소문자를 구분합니다. ( * 변수 Num과 변수 num은 서로 다른 변수이므로 주의 하셔야 합니다 !)

- 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름으로 사용할 수 없습니다. (키워드는 미리 약속된 단어들을 얘기합니다. ex) int, else, if 등등..)

- 변수의 이름 사이에 공백이 삽입될 수 없습니다. ex) int num1 test; <<< 이러한 경우 int num_test; 공백대신 언더바(_)를 사용하시면 하나의 변수로 인식합니다.




3. 변수의 종류


1) 정수형 변수

   - 정수 값의 저장을 목적으로 선언된 변수 입니다.

   - 정수형 변수는 char형, short형, int형, long형 변수로 나누어 집니다.


2) 실수형 변수

   - 실수 값의 저장을 목적으로 선언된 변수 입니다.

   - 실수형 변수는 float형 변수와 double형 변수로 나누어 집니다.


* 정수형 변수와 실수형 변수가 나누어지는 이유는 정수를 저장하는 방식과 실수를 저장하는 방식이 다르기 때문입니다. 이는 추후에 추가적으로 설명하겠습니다.




4. 단항 연산자, 이항 연산자


단항, 이항 연산자는 피연산자의 수를 기준으로 나누어진 연산자입니다.

ex) 3 + 4 << +는 피연산자로 왼쪽과 오른쪽에 각각 3과 4를 피연산자로 가지기 때문에 이항 연산자입니다.

     ++num; << ++는 피연산자로 오른쪽에 num만을 사용하기 때문에 단항 연산자입니다.




5. 대입 연산자, 산술 연산자


대입 연산자 : 값을 저장하는 연산자입니다.

산술 연산자 : 산술 연산을 하는 연산자입니다.


연산자 

연산자의 기능 

결합방향 (연산의 실행이 어느 방향으로 진행되어지는지를 나타냅니다.)

연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입합니다. ex) num = 20; 

<- 

두 피연산자의 값을 더합니다. ex) num = 4 + 3; 

-> 

 -

왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 빼줍니다. ex) num = 4 - 3; 

-> 

두 피연산자의 값을 곱합니다. ex) num = 4 * 3; 

-> 

왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눕니다. ex) num = 4 / 3; 

-> 

왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환합니다. ex) num = 7 % 3 

-> 




6. 복합 대입 연산자


복합 대입 연산자는 두가지의 연산자가 복합으로 만들어진 하나의 연산자를 복합 연산자라 합니다.

ex) + 와 = 연산자가 복합으로 만들어진 하나의 연산자 +=


복합 대입 연산자의 종류


a = a + b 

== 

a += b 

a = a - b 

== 

a -= b 

a = a * b

==

a *= b 

a = a / b 

== 

a /= b 

a = a % b 

== 

a %= b 


왼쪽의 연산과 오른쪽의 연산이 같은 연산입니다.


이때 a = a + b 라는 연산을 예로 들어서 a값이 a + b 값과 같다라고 생각 하실 수 있습니다.

하지만 프로그래밍 언어에서는 그러한 의미가 아닌 a에 저장되어 있는 값을 b만큼 증가시켜서 나온 값을 다시 a에 저장하라는 의미 입니다.

ex) int a = 3;     a = a + 1;   a = 3 + 1; 이 되어 a에 3이 아닌 4가 저장이 됩니다.

이러한 연산을 간편하게 해주기 위하여 복합 대입 연산자를 사용합니다.





7. 부호의 의미를 갖는 + 연산자와 - 연산자


+ 연산자와 - 연산자는 산술 연산의 연산자에 해당이 되지만, 수학시간에서 양수, 음수를 결정짓는 부호를 나타내는 부호 연산자로도 사용이 됩니다.





8. 증가, 감소 연산자


증가, 감소 연산자는 변수에 저장된 값을 1 증가 및 감소시키는 경우에 사용되는 연산자입니다.


* 단항 연산자입니다. 사용빈도가 굉장히 높으니 꼭 알아 두셔야 합니다 !


연산자

연산자의 기능

결합방향 

++num 

++num 연산을 실행 후, 문장을 실행합니다.

ex) val = ++num; 

<- 

num++ 

num++의 연산보다 문장을 먼저 실행하고, 연산을 진행 합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num++;

-> 

--num 

--num 연산을 실행 후, 문장을 실행합니다.

ex) val = --num; 

<- 

num-- 

num--의 연산보다 문장을 먼저 실행하고, 연산을 진행합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num--; 

-> 


위의 표가 이해가 되지 않으시면 다음 예제를 보고 확인하시면 됩니다.


* 증가, 감소 연산자 사용시 주의 사항

  - ex) ++3 혹은 --3의 경우에는 에러가 발생 합니다. ++연산자, -- 연산자는 '저장 되어 있는 값(변수)'에 대하여 연산을 실행하기 때문에 ++3과 --3처럼 상수에 직접 연산을 하게 되면 에러가 발생합니다. ++연산자와 --연산자의 피연산자는 변수만 사용 가능합니다. 반드시 ++와 -- 사용시 상수가 아닌 변수를 대상으로 사용하셔야 합니다.




9. 관계 연산자


관계 연산자는 두 개의 값을 비교하는 연산자입니다.


관계 연산자의 종류


연산자 

연산자의 기능 

결합방향 

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 보다 같거나 큰가?

->


관계 연산자를 사용할 때는 주로 두 개의 값을 비교해서 참(O) 또는 거짓(X)를 결정하기 위해 사용하는데 이 때 참 이면 0이 아닌 수 중 대표적인 값인 1을 사용하고, 거짓일 경우 0을 사용합니다.


다른 대부분의 프로그래밍 언어들도 비슷하겠지만 C언어는 0이 아닌 모든 값을 참으로 간주합니다. 단지 1이 참을 의미하는 대표적인 값이기 때문에 연산의 조건을 만족하면 참을 의미하는 1을 반환합니다.


추가적인  이해가 필요 하신 분들은 예제 사진을 보고 확인 하시면 되겠습니다.





10. 논리 연산자


논리 연산자는 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자입니다.


(저 같은 경우 AND는 수학의 교집합, OR는 합집합, NOT은 여집합 처럼 이해를 했습니다. 완전히 같은 건 아니지만 상당히 비슷 하더라구요. 그렇다고 제가 맞다는 말이 아니에요! 혹시라도 제 방식처럼 이해 하시는 분이 계실 수 있는데 잘 못 이해 하시면 안 됩니다. ㅠㅠ... 반드시 자신이 이해 하기 쉬운 방식으로 이해 하시는 걸 추천 드립니다 !)


논리 연산자의 종류


연산자 

연산자의 기능 

결합방향 

&& 

 ex) A && B

A와 B 모두 '참'이면 연산결과로 '참'을 반환(논리 AND)

-> 

|| 

ex) A || B

A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR) 

-> 

ex) !A

A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT) 

<- 


논리 연산자도 헷갈리는 경우가 많은데요(저는 그랬습니다...) 추가적인 이해가 필요하신 분들은 다음의 예제를 통해 확인 하시면 되겠습니다.





11. 콤마 연산자(,)


콤마도 연산자입니다.

단지 다른 연산자들과 달리 연산의 결과가 아닌 '구분'을 목적으로 사용합니다.

둘 이상의 변수를 동시에 선언하거나 둘 이상의 문장을 한 행에 삽입하는 경우에 사용되는 연산자 입니다.


콤마 연산자의 사용 예제 입니다.



변수 선언에서도 확인 할 수 있듯이 일반적으로 int num1 =1; 처럼 변수를 선언 해주고 다음 행으로 넘어가서 선언 해주는 경우도 있지만 예제처럼 콤마(,)를 사용하여 한 행에서 변수 선언을 다 해주는 경우도 가능한 것을 확인 할 수 있습니다.




12. 연산자의 우선순위와 결합방향


연산자의 우선순위

- 연산의 순서에 대한 순위입니다.

- ex) 덧셈과 뺄셈보다는 곱셈과 나눗셈의 우선순위가 높습니다.


연산자의 결합방향

- 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것입니다.

- 우선순위가 동일한 두 연산자 사이에서의 연산을 진행하는 방향을 말합니다.

- ex) 덧셈, 뺄셈, 곱셈, 나눗셈 모두 결합방향이 왼쪽에서 오른쪽으로 진행됩니다.      3 + 4 X 5 / 2 - 10  이 경우 연산자의 우선순위에 근거하여 곱셈과 나눗셈이 먼저 진행이 됩니다. 또한 결합방향에 근거하여 곱셈이 나눗셈보다 먼저 진행이 됩니다.


다음은 연산자의 우선순위와 결합방향에 대한 정보를 나타낸 표입니다.


 순위

연산기호 

연산자 

결합방향 

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위 

  , 

  콤마연산 

->




13. C언어의 표준 키워드


마지막으로 C언어의 표준 키워드에 대해 알아 보겠습니다.


C언어의 문법을 구성하는, 그 의미가 결정(약속)되어 있는 단어 키워드(keyword)라 합니다.


keyword는 약속되어 있는 단어들이기 때문에 변수의 이름으로 지정할 수 없습니다.


keyword의 종류는 다음과 같습니다.


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 


표에서 확인 가능한 키워드들은 기능 및 의미가 정해져 있기 때문에 변수로 사용할 수 없습니다.




다음에는 데이터 표현방식에 대하여 공부하고, 글을 올리도록 하겠습니다.






'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 공부 시작  (0) 2016.12.21

C언어를 얼른 끝내자는 생각이 많았었는데


시작한지 얼마 되지도 않아서 이런 저런 이유들로 포인터 들어가고 하지를 않았네요...


방학도 시작 했고, 시간 날 때 마다 틈틈이 해야겠어요

(C언어 끝까지 하는 것을 목표로!)


처음은 했었던 부분이기도 하고, 다른 프로그래밍 언어를 하고 있어서 금방 했어요!


다른 프로그래밍 언어에 대해서는 나중에 따로 올리도록 할게요


일단 오늘부터 C를 처음부터 다시 시작했어요


1. main()


C언어 에서 'main()' 함수는 호출(실행)을 명령하지 않아도 자동으로 실행이 되는 함수 입니다.



main() 함수는 C언어 에서 처음 시작 할 때 main 함수가 없으면 실행이 되지 않아요.


* 혹시라도 main 함수를 빼먹지 않도록 주의 하셔야 됩니다 !


2. 헤더파일 선언


헤더파일 선언 부분은 예전에 C언어 처음 공부 할 때 무슨 말인지 이해 못 하고 #include <불러올 헤더 파일> 이렇게 선언을 해주고 프로그래밍을 했었는데, 최근에 공부하면서 알게 된게 PHP에서 include로 파일 불러오고, Python에서 import로 모듈 불러오는 거랑 비슷(?) 하다는 걸 알게 됐어요.

(예전에는 반드시 알고가야 직성이 풀리는 저의 성격상.. C언어 에서는 프로그래밍 할 때 무조건 헤더파일 선언을 해주고 가야 되는 구나~ 라고 생각 했었다는...)


3. printf() 함수


printf() 함수는 ()안에 ""를 넣어주고, "" 안에 출력을 원하는 문자열을 넣어 주면 됩니다. (혹시라도 큰 따옴표("")가 아닌 작은 따옴표('')를 사용 하실 경우 출력이 정상적으로 되지 않습니다. 주의하세요!)

printf() 함수는 함수 선언을 해주지 않아도 사용 가능한 '함수' 입니다.

이러한 함수들을 '표준함수'라고 하는데 Python의 '내장함수'와 비슷(?) 하다고 생각하시면 될 것 같네요.

이러한 표준 함수들을 모아 놓은 것이 '표준 라이브러리' 라고 합니다.

printf() 함수는 기본적으로 헤더파일 중 'stdio.h' 안에 있어서 헤더파일 선언 시 #include <stdio.h>를 해주지 않으면 printf() 함수를 사용 할 수 없습니다.

stdio가 standard input output (표준 입, 출력)의 약자라고 생각이 되는데 한 번 찾아 봐야겠어요.


4. 주석


주석은 어떤 프로그래밍 언어든지 소스코드에 삽입된 메모를 뜻합니다.

이러한 주석은 컴파일의 대상에서 제외 되며, 주석의 有,無 여부와 상관 없이 컴파일 및 실행의 결과에 영향을 미치지 않습니다.


C언어에서 주석은 2종류가 있습니다.

1) /* */

2) //


첫 번째 주석은 블록단위 주석입니다.

주석의 시작(/*)과 끝(*/)을 명시해서 주석 처리를 합니다.


두 번째 주석은 행 단위 주석입니다.

// 표시가 있는 해당 줄의 경우 //표시 이후의 내용은 주석으로 인식 합니다.


5. 서식문자


서식문자의 종류에는 여러가지가 있겠지만 이번에는 정수형태의 출력결과를 가져오는 %d에 대해서 간단하게 사용법만 알아보겠습니다.



사진에서 나온 결과처럼 서식문자인 %d가 있는 부분을 ,로 printf() 함수에서 인자를 구분해서 %d대신 출력할 정수를 지정해준 후 출력을 해 본 결과입니다.


%d의 개수와 순서에 따른 출력 결과를 확인 하실 수 있습니다.




얼마 하지도 않고, 대단한 것을 한 것도 아닌데 굉장히 대단한 것처럼 보이네요;;


다음 글에서는 C언어의 변수와 연산자에 대하여 공부하고, 글을 올리도록 하겠습니다.






'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24

+ Recent posts