본문 바로가기
문법관련/C

6. 연산자

by print_soo 2024. 6. 12.

/ 연산자와 % 연산자의 차이

/는 몫을 나타내고 %는 나머지를 나타낸다.

// --- / ---

int a = 5;
int b = 2;

printf("%d 나누기 %d = %d", a, b, a/b);
//--출력--
// 5 나누기 2 = 2 

위 처럼 정수끼리 나눠주면 정수 값만 출력한다. 따라서 실수 값으로 출력하고 싶다면 실수끼리 나눠줘야한다.

// --- / ---

 double a = 5.0;
 double b = 2.0;

 printf("%.1lf 나누기 %.1lf = %.1lf", a, b, a/b);
//--출력--
// 5.0 나누기 2.0 = 2.5

 

증감 연산자

int a,b = 10;

++a; // 해당 코드는 a = a + 1; 과 같다. 따라서 11
--b; // 해당 코드는 b = b + 1; 과 같다. 따라서 11  

전위 표기와 후위 표기의 차이

전위 표기란 ++a, —b 와 같이 변수 앞에 증감 연산자를 사용하는 경우이고, 후위 표기는 a++, b—와 같이 변수 뒤에 증감 연산자를 사용하는 경우이다.

단독으로 쓸 때는 값의 변화가 없지만 다른 연산자랑 사용할 때는 변화가 있다.

int a, b =5;
int pre, post;

pre = (++a) * 3; // 전위 표기는 증가된 값이 곱해지기에 먼저 증가 '6', 그 후 곱셈 '18'
post = (b++) * 3; // 후위 표기는 증가되기 전 값이 곱해지기에 '5', 그 후 곱셈 '15' 그 후 b 값이 증가된다. 

printf("증감 연산후 초기값 a = %d, b = %d\\n", a, b);
printf("전위 표기 pre: %d, 후위 표기 post: %d", pre, post);

쉽게 이야기하자면

  1. 전위 표기
    1. 전위 표기 된 변수 값 증가 | a [ 6 ]
    2. 곱셈 | pre [ 18 ]
  2. 후위 표기
    1. 후위 표기 된 변수 값 유지 ****| b [ 5 ]
    2. 유지된 값이랑 곱셈 ****| post [ 15 ]
    3. 후위 표기 된 변수 값 증가 | b [ 6 ]

비트 연산자

비트 연산자에는 논리 연산자 이동 연산자가 있다.

  1. 논리
    1. &
    2. |
    3. ^
    4. ~
  2. 이동
    1. <<
    2.  

& (논리곱) 연산자

int a = 10;
int b = 5;

printf("a & b: %d", a & b); // 0

																	거짓거짓거짓거짓
	   00000000 00000000 00000000 00001010
	&) 00000000 00000000 00000000 00000101
	ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	   00000000 00000000 00000000 00000000

| (논리합) 연산자

int a = 10;
int b = 5;

printf("a | b: %d", a | b); // 15

																	참참참참
	   00000000 00000000 00000000 00001010
	|) 00000000 00000000 00000000 00000101
	  ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	   00000000 00000000 00000000 00001111

^(배타적 논리합) 연산자

: 두 피연산자의 참, 거짓 값이 서로 다를 때만 참이다.

int a = 10;
int b = 5;

printf("a ^ b: %d", a ^ b); // 15

								     참참참참
	   00000000 00000000 00000000 00001010
	^) 00000000 00000000 00000000 00000101
	 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	   00000000 00000000 00000000 00001111

~(부정) 연산자

: 피연산자의 비트를 반전 시킨다.

int a = 10;

printf("~a: %d", ~a); // -11

	~) 00000000 00000000 00000000 00001010
	 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	   11111111 11111111 11111111 11110101

<< >> (이동)연산자

: <<는 왼쪽으로 이동, >>는 오른쪽으로 이동

int a = 10;

printf("a << 1: %d", a << 1); //20

	<<) 00000000 00000000 00000000 00001010
	 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	    00000000 00000000 00000000 00010100	
		  
printf("a >> 1: %d", a >> 1); //5

	>>) 00000000 00000000 00000000 00001010
	 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	    00000000 00000000 00000000 00000101

비트들이 이동했을 때 비워진 칸들은 어떻게 되나?

→ 0으로 모두 채워진다. 단, 만약 해당 값이 음수 였다면 1을 넣어 음수를 유지해 주어야한다.

'문법관련 > C' 카테고리의 다른 글

8. 함수  (0) 2024.06.14
7. 반복문 - do while  (0) 2024.06.13
5. scanf 함수  (1) 2024.06.10
4-2. 자료형 마다 저장할 수 최대값과 최솟값  (0) 2024.06.03
4. 변수 선언 및 초기화  (0) 2024.06.03