05. 연산자
산술연산자
+ : 왼쪽의 피연산자에서 오른쪽의 피연산자를 더함
- : 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌
* : 왼쪽의 피연산자에서 오른쪽의 피연산자를 곱함
/ : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔
-> 정수끼리 연산하면 몫을 구할 수 있음 ex) 10 / 3 = 3
% : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 나머지를 반환
예제 1)
int num1, num2, num3;
num1 = 9 + 8 / 2 * 4; // 25
num2 = 8 - 12 * (2 + 2) / 8 % 2; // 8
num3 = 1 % 3 * (1 + 3) * (12 / 6) % 10; // 8
대입연산자
= : 왼쪽의 피연산자에 오른쪽의 피연산자를 대입
복합대입연산자
+= : 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결과값을 왼쪽의 피연산자에 대입
-= : 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결과값을 왼쪽의 피연산자에 대입
*= : 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결과값을 왼쪽의 피연산자에 대입
/= : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결과값을 왼쪽의 피연산자에 대입
%= : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입
증감연산자
다른 연산자들과는 다르게 피연산자가 한개이다
++num(전위 증가 연산자) : 피연산자의 값을 1 증가시킨 후, 연산을 진행
num++(후위 증가 연산자) : 연산을 먼저 진행하고 나서 피연산자의 값을 1 증가
--num(전위 감소 연산자) : 피연산자의 값을 1 감소시킨 후, 연산을 진행
num--(후위 감소 연산자) : 연산을 먼저 진행하고 나서 피연산자의 값을 1 감소
예제 3)
int n1 = 8, n2 = 6, n3;
n3 = n1++ + ++n2;
printf("%d %d %d\n", n1, n2, n3);
/*출력결과
9 7 15
*/
int a = 5, b = 6, c = 10, d;
d = ++a * b--; // a = 6, b = 5, d = 36
printf("a = %d, b = %d, d = %d\n", a, b, d);
d = a++ + ++c - b--; // a = 7, b = 4, c = 11, d = 12
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
/*출력결과
a = 6, b = 5, d = 36
a = 7, b = 4, c = 11, d = 12
*/
비교연산자
연산의 결과가 참일 경우에는 1, 거짓일 경우에는 0을 반환
== : 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 1을 반환
!= : 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 1을 반환
> : 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 1을 반환
>= : 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 1을 반환
< : 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 1을 반환
<= : 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 1을 반환
예제 4)
int num1 = 10, num2 = 20, num3 = 4;
int num4 = 13, num5 = 4;
printf("%d\n", num1 == num2); //0
printf("%d\n", num4 != num1); //1
printf("%d\n", num4 > num2); //0
printf("%d\n", num5 >= num3); //1
printf("%d\n", num1 < num4); //1
printf("%d\n", num3 <= num1); //1
논리연산자
&& (논리 AND 연산) : 논리식이 모두 참이면 1을 반환, 둘 중 하나라도 거짓이면 0을 반환
|| (논리 OR 연산) : 논리식이 둘 중 하나라도 참이면 1을 반환
! (논리 NOT 연산) : 참이면 거짓, 거짓이면 참으로 반전
-> 논리 NOT 연산의 경우 피연산자가 1개만 존재한다
- 논리 AND 연산의 경우 왼쪽의 논리식이 거짓일 경우 오른쪽의 논리식은 진행하지 않는다
- 논리 OR 연산의 경우 왼쪽의 논리식이 참일 경우 오른쪽의 논리식은 진행하지 않는다
예제 5)
int num1 = 10, num2 = 20, num3 = 4;
int num4 = 13, num5 = 4;
printf("%d\n", num5 >= num3 || num1 == num2); // 1
printf("%d\n", num4 != num1 && num1 < num4); // 1
printf("%d\n", num4 > num2 && num3 == num5); // 0
printf("%d\n", !num5 > num3); //0 //!의 연산자 우선순위가 > 연산자 우선순위보다 높음, !4 > 4 -> 0 > 4 -> 0
printf("%d\n", !(num1 < num4) || num3 <= num1); // 1
int a = 1, b = 0, c = 12, d = 12;
d = a++ || ++b * d-- / ++c; // 논리 OR 연산의 경우 왼쪽의 논리식이 참일 경우 오른쪽의 논리식은 진행하지 않는다. 따라서, || 뒤의 논리식들은 진행되지 않는다 a = 2, b = 0, c = 12, d = 1
d = b++ && ++a / ++c * d++; // 논리 AND 연산의 경우 왼쪽의 논리식이 거짓일 경우 오른쪽의 논리식은 진행하지 않는다 a = 2, b = 1, c = 12, d = 0