『Lena's by ☆볶기!!』: Restart !!

Rorolena
[C/C++] 3. 변수와 연산자



즐거운 프로그래밍 2번째 시간이 왔습니다.

이번 포스팅에선
변수와 연산자에대한 개념에 관해
설명 하고자 합니다.
(이번 포스팅은 꾀길어질 예감이 팍팍 들어옵니다.)

자 먼저 변수와 연산자란

변수는 어떤 특정 정보, 값, 숫자 등을
저장하기위한 하나이 공간입니다.

연산자란 이런 값을 제어하기 위한 수단입니다.
가장 우리에게 흔한 것으로 사칙연상
+, -, *, / 가 있겠죠

자 이런것을 기술한것이
이번 포스팅의 요점이니 유념 부탁드립니다.

이하 탭은 변수와 연산자의 타입을 간략히 정돈 해둔 것입니다.

연산자의 종류에관한 자세한 설명을 하겠습니다.
아래부턴 지루한(?)설명과 실습의 연속이니 이점 유의 부탁드립니다.

1. 대입 연산자(=)와 산술 연산자(+, -, *, /, %)

두 개의 피연산자를 요구하는 연산자를 이항 연산자라 하는데
이번에 소개하는 대입 연산자와 산술 연산자는 모두 이항 연산자들입니다.

\= 연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입합니다.
+ 두 피연산자의 값을 더합니다.
- 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺍니다.
* 두 피연산자의 값을 곱합니다.
/ 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눕니다.
% 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나누고난 나머지 값을 반환합니다.

아래의 소스로 확인해 봅시다.

int main(void)
{
int num1 = 9, num2 = 2;
printf("%d + %d = %d \n", num1, num2, num1+num2);
printf("%d - %d = %d \n", num1, num2, num1-num2);
printf("%d × %d = %d \n", num1, num2, num1*num2);
printf("%d ÷ %d의 몫= %d \n", num1, num2, num1/num2);
printf("%d ÷ %d의 나머지= %d \n", num1, num2, num1%num2);

return 0;
}

2. 복합 대입 연산자

다른 연산자와 합쳐진 형태의 대입 연산자도 존재하는데
이를 복합 대입 연산자라 하며, 이의 종류는 다음과 같습니다.

*=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

이중 산술 연산자와 합쳐진 복합 대입 연산자의 의미는 다음과 같다.

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

다음 소스를 통해 확인해 봅시다.

int main(void)
{
int num1=2, num2=4, num3=6;

num1 += 3;
num1 *= 4;
num1 %= 5;
printf("Result: %d, %d, %d \n", num1, num2, num3);

return 0;


다음과 같이 나오면 성공한것 입니다.



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

+와 -는 이항연산자로서는 덧셈과 뺄셈을 의미하지만
피연산자가 하나인 단항 연산자로써는 부호를 뜻하기도 합니다.
다음 소스를 통해 확인해보도록 합시다.

int main(void)
{
int num1 = +2;
int num2 = -4;

num1 = -num1;
printf("num1: %d \n", num1);
num2 = -num2;
printf("num2: %d \n", num2);

return 0;
}



참고 사항으로 연산자를 쓸때는 위의 소스과 같이
띄어쓰기를 해주어 빠른 의미파악이 되도록 합시다.

4. 증가, 감소 연산자

이번 연산자는 저장된 값을 1씩 증가 또는 감소시키는 경우에 사용되는 연산자로써
단항 연산자로서 활용 빈도가 높기때문에 꼭 기억하시기 바랍니다.

++num, --num: 값을 1씩 증/감후 속한 문장의 나머지를 진행(선 증/감, 후연산)
num++, num--: 속한 문장을 먼저 진행한 수, 값을 1증가 혹/감(선 연산, 후 증/감)

위의 연산자는 피연산자 왼편에 붙는 경우에는
먼저 변수에 저장된 값을 증/감후 문장의 나머지 부분을 실행하고
연산자가 피연산자 오른편에 붙는 경우에는 이를 반대로
문장 전체를 실행한 다음 변수에 저장된 값을 증/감 합니다.

아래의 소스를 통해 꼭 확인해보도록 합시다.

int main(void)
{
int num1 = 12;
int num2 = 12;
printf("num1: %d \n", num1);
printf("num1++: %d \n", num1++);
printf("num1: %d \n\n", num1);
printf("num2: %d \n", num2);
printf("++num2: %d \n", ++num2);
printf("num2: %d \n\n", num2);

return 0;
}


이결과에 대해 위의설명과 비교하여 자세히 생각해보시기 바랍니다.

5. 관계 연산자(<, >, ==, !=, <=, >=)

관계 연산자는 대소와 동등의 관계를 따지는 연산자로 의미는 다음과 같습니다.

<: n1 < n2 n1이 n2보다 작은가?
>: n1 > n2 n1이 n2보다 큰가?
==: n1 == n2 n1과 n2는 같은가?
!=: n1 != n2 n1과 n2는 다른가?
<=: n1 <= n2 n1이 n2보다 같거나 작은가?
=>: n1 => n2 n1이 n2보다 같거나 큰가?

위의 관계 연산자들은 조건을 만족하면 1을, 만족하지 않으면 0을 반환한다.
그런데 여기서 말하는 1은 0은 참과(true) 거짓(false)을 의미하는 대표적 숫자입니다.
따라서 의미대로 이야기 해보면 아래와 같이 됩니다.

"조건을 만족하면 참을, 만족하지 않으면 거짓을 반환한다."
이러한 표현이 의미하는 바가 더 명확하기 때문에 주로 1과 0이라기보다
참과 거짓이라는 표현을 주로 사용하니 이점 유의 바랍니다.

6. 논리 연산자(&&, ||, !)

논리 연산자란 AND(논리곱), OR(논리합), NOT(논리부정)을
표현하는 연산자로 의미는 다음고 같습니다.
&&: A && B A와 B 모두 참이면 연산결과로 참을 반환
||: A || B A와 B 둘 중 하나라도 참이면 연산결과로 참을 반환
!: !A A가 참이면 거짓, A가 거짓이면 참을 반환
위의 의미를 다음 소스로 확인해 보겠습니다.

int main(void)
{
int num1=10;
int num2=12;
int result1, result2, result3;

result1 = (num1==10 && num2==12);
result2 = (num1<12 || num2>12);
result3 = (!num1);

printf("result1: %d \n", result1);
printf("result2: %d \n", result2);
printf("result3: %d \n", result3);

return 0;
}



위의소스중 주목할 부분으로
result3 = (!num1);

이부분 처리에 관해서입니다.

C언어는 0이 아닌 모든 값을 참으로 간주하는 특성인대
즉 거짓을 의미하는 숫자는 유일하게 0 하나이고,
0이 아닌 모든 숫차는 참으로 인식된다는 이야기 입니다.

7. 콤마 연산자(,)

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

뿐만 아니라, 둘 이상의 인자를 함수로 전달할 때도
인자의 구분을 목적으로 사용됩니다.
즉 콤마 연산자는 다른 연산자들과 달리,
연산의 결과가 아닌 구분을 목적으로 주로 사용됩니다.

아래 소스를 통하여 확인해보도록 합시다.

int main(void)
{
int num1=1, num2=2;
printf("Hello "), printf("world! \n");
num1++, num2++;
printf("%d ", num1), printf("%d ", num2), printf("\n");

return 0;
}



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

이번에는 연산자의 우선순위와 결합방향에 대한 설명인대
이부분은 우리가 초등학교부터 지금까지 수를 다루면서 경험한 부분입니다.
즉 무엇을 먼저 순서대로 계산해야 하는가인대
이부분을 아래의 표에 각연산기호를 순위별로 정리하였습니다.

순위

연산기호

연산자

결합방향

1위

()

함수호출

[]

인덱스

->

간접지정

.

직접지정

++
--

후위증가 및 감소

2위

++
--

전위증가 및 감소

sizeof

바이트 단위 크기 계산

~

비트 단위 NOT

!

논리 NOT

-, +

부호 연산(음수와 양수의 표현)

&

주소 연산

*

간접지정 연산

3위

(casting)

자료형 변환

4위

*, /, %

곱셉, 나눗셈 관련 연산

5위

+, -

덧셈, 뺄셈

6위

<<, >>

비트이동

7위

<, >, <=, >=

대소비교

8위

==, !=

동등비교

9위

&

비트 AND

10위

^

비트 XOR

11위

|

비트 OR

12위

&&

논리 AND

13위

||

논리 OR

14위

? :

조건연산

15위

=, +=, -=, *=, /=, %=,
<<=, >>=, &=, ^=, |=

대입연산

16위

,

콤마연산

이 번 파트에 관해서는
이개 무슨 개소리야!!!!!!
라고 생각 하시는 분들도
있으실지 모르겠지만

처음에는 문법으 배운다 생각 해주시고
가볍게 넘기면서 이해를 하는 방향으로 가주시면
속편하게 습득 하실수 있습니다.

여기까지 읽느라 수고 하셨구요
다음 포스팅에서는 아마 데이터 표현방식의
이해에 관하여 포스팅할 예정입니다.

알림사항에도 썻듣이
궁금하신점은 q&a에 부탁드립니다.