대입 연산자(=)와 산술 연산자(+,-,*,/,%)
두 개의 피연산자를 요구하는 연산자를 가리켜 '이항 연산자(binary operator)' 라 한다.
연산자 | 연산자의 기능 | 결합방향 |
= | 연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입한다. 예)num = 20; | ← |
+ | 두 피연산자의 값을 더한다. 예) num = 4+3; | → |
- | 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다. | → |
* | 두 피연산자의 값을 곱한다. 예) num = 4*3; | → |
/ | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다. 예) num = 7/3; | → |
% | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. 예) num = 7%3; | → |
다음 예제를 통해서 위의 연산자들의 사용의 예를 보자.
<OperatorOne.c>
#include <stdio.h>
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("%dx%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;
}
부호연산의 의미를 갖는 +연산자와 - 연산자
+ 연산자와 - 연산자는 이항 연산자로서 덧셈과 뺄셈을 의미하지만, 피연산자가 하나인 단항 연산자로서 부호를 뜻하기도 한다. 이는 +3, -7과 같이 숫자 앞에 붙는 부호를 뜻하는 것이므로 생소하지 않을 것이다. 이와 관련한 예제를 보자
<OperatorThree.c>
#include <stdio.h>
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;
}
참고
부호 연산자가 삽입된 문장과 복합 대입 연산자가 삽입된 문장을 혼동하는 경우가 있다. 다음과 같이 연산자와 피연산자 사이에 공백을 삽입하지 않는 경우에는 더욱 혼동하기가 쉽다.
num1 =-num2; // 부호 연산자의 사용
num1-=num2; // 복합 대입 연산자의 사용
따라서 모든 경우에 연산자와 피연산자 사이에 공백을 두지는 않더라도, 위의 두 경우에 한해서는 다음과 같이 공백을 두는 것이 혼란을 최소화할 수 있는 방법이 된다.
num1 = -num2; //부호 연산자의 사용
num1 -= num2; //복합 대입 연산자의 사용
증가, 감소 연산자
연산자 | 연산자의 기능 | 결합방향 |
++num | 값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산) 예)val = ++num; |
← |
num++ | 속한 문장을 먼저 진행한 후, 값을 1 증가(선 연산, 후 증가) 예)val = num |
→ |
--num | 값을 1 감소 후, 속한 문장의 나머지를 진행(선 감소, 후 연산) 예)val = --num; |
← |
num-- | 속한 문장을 먼저 진행한 후, 값을 1 감소(선 연산, 후 감소) 예)val= num--; |
→ |
++ 연산자와 -- 연산자는 이름 그대로 값을 1 증가 및 감소 시키는 연산자이다. 그런데 이 두 연산자는 삽입된 위치에 따라서 그 의미가 달라진다. 피연산자의 왼편에 붙는 경우에는 (++num, --num), 먼저 변수에 저장된 값을 증가 및 감소 시키고 나서 문장의 나머지 부분을 실행하게 된다. 반면, 피연산자의 오른쪽에 붙는 경우에는 (num++ , num--), 문장 전체를 실행한 다음에 값을 증가 및 감소 시키게 된다.
<OperatorFour.c>
#include <stdio.h>
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", num2);
return 0;
}
<OperatorFive.c>
#include <stdio.h>
int main(void)
{
int num1=10;
int num2=(num1--)+2; // 후위 감소
printf("num1: %d \n" , num1);
printf("num2: %d \n", num2);
return 0;
}
위 예제 int num2=(num1--)+2;에서는 변수 num1에 대해서 '선 연산, 후 감소'를 진행하고 있다. 그런데 이 연산의 앞과 뒤에 소괄호가 채워져 있다. C언어에서는 소괄호도 연산자이다. 그리고 이는 수학의 소괄호와 의미가 같다. 즉, 먼저 연산하라는 뜻이다.
후위증가 및 후위 감소 연산시에는 '소괄호의 영향을 받지 않고, 다음 문자으로 넘어가야만 비로소 값의 증가 및 감소가 이뤄진다'
관계 연산자 ( <, >, ==, !=, <=, >=)
관계 연산자는 대소와 동등의 관계를 따지는 연산자이다. '비교 연산자'라고도 한다. 두개의 값을 비교하기 때문이다.
연산자 | 연산자의 기능 | 결합방향 |
< | 예) 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은 '참(True)'을, 0은 '거짓(False)'을 의미하는 대표적인 숫자이다. 따라서 다음과 같이 이야기하는 것이 더 일반적이다.
"조건을 만족하면 '참(true)'을, 만족하지 않으면 '거짓(false)'을 반환한다.
이와 관련한 예제를 보자
<OperatorSix.c>
#include <stdio.h>
int main(void)
{
int num1 = 10;
int num2 = 12;
int result1, result2, result3;
result1 = (num1==num2);
result2 = (num1<=num2);
result3 = (num1>num2);
printf("result1: %d \n", result1);
printf("result2: %d \n", result2);
printf("result3: %d \n" , result3);
return 0;
}
논리 연산자(&&, ||, !)
논리 연산자란 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자이다.
연산자 | 연산자의 기능 | 결합방향 |
&& | 예) A && B A와 B 모두 '참'이면 연산결과로 '참'을 반환(논리 AND) |
→ |
|| | 예) A || B A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR) |
→ |
! | 예)!A A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT) |
← |
<OperatorSeven.c>
#include <stdio.h>
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); 이 문장은 논리 NOT 연산의 예를 보여준다. 따라서 num1에 1이 저장되어 있다면 result3에는 0이 저장되고, num1에 0이 저장되어 있다면 result3 에는 1이 저장된다. 그렇다면 0도 1도아닌 다른 값이 저장되어 있다면 result3에는 어떤 값이 저장되겠는가? 이와 관련해서 다음 사실을 알 필요가 있다.
"C언어는 0이 아닌 모든 값을 '참(true)'으로 간주 한다.
즉, '거짓'을 의미하는 숫자는 유일하게 0 하나이고, 0이 아닌 모든 숫자는 '참'으로 인식된다. 다만, 그중에서도 '참'을 의미할 때 주로 사용되는 숫자가 1이고, 그래서 연산의 결과로 '참이' 반환되어야 할 떄 1이 반환되는 것 뿐이다. 그리하여서 result3에 0이 저장이 된 것이다.
콤마 연산자( , )
콤마 연산자는 둘 이상의 변수를 동시에 선언하거나, 둘 이상의문장을 한 행(line)에 삽입하는 경우에 사용되는 연산자이다. 뿐만 아니라, 둘 이상의 인자를 함수로 전달할 때도 인자의 구분을 목적으로 사용된다. 즉, 콤마 연산자는 다른 연산자들과 달리, 연산의 결과가 아닌 '구분'을 목적으로 주로 사용된다.
<CommaOp.c>
#include <stdio.h>
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;
}
연산자의 우선순위와 결합방향
결합방향 : 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것
그렇다면 사칙연산의 결합방향은 무엇이라고 말할 수 있을까? 이들 수학 연산자는 왼쪽에 있는 연산자부터 오른쪽에 있는 연산자의 순으로 진행을 하므로, '왼쪽에서 오른쪽' 이라고 말할 수 있다. 즉 이를 화살표로 표시하면 →이 된다.
'C언어 > 윤성우의 열혈 C 프로그래밍' 카테고리의 다른 글
03-1 연산을 위한 연산자와 값의 저장을 위한 변수 (0) | 2022.08.03 |
---|---|
02-3 printf 함수의 기본적인 이해 (0) | 2022.08.01 |
02-2 주석이 들어가야 완성된 프로그램 (0) | 2022.08.01 |
chapter 02 프로그램의 기본구성 -1 (0) | 2022.07.28 |