C언어(2020년)

19. 연산자

리더2333 2020. 11. 3. 20:13
반응형

연산자 우선순위 표

1. ( ) 연산자

int a = 10;

int b = 2;

int c = 1;

int d = a * (b+c);

( ) 연산자는 연산자 우선순위가 가장 높으므로

b+c 가 먼저 연산 된 후에 a 와 곱해지게 된다.

 

2. [ ] 연산자

int a[3] = { 0,1,2 };

int b = a[0] + a[1] + a[2];

배열을 사용할 때 [ ] 연산자가 + 연산자 보다 우선된다는 의미이다.

 

3. -> . 연산자

새로운 자료형인 구조체를 만든다고 하면

struct A

{

   int a;

   int b;

};

이와 같이 정의 할 수 있다.

 

이것은 A 라는 자료형을 새로 만들었다는 의미인데,

그 A 라는 자료형은 int a, int b 를 가지고 있기 때문에

sizeof(A) 로 자료형의 크기를 알아보면 8 바이트가 된다.

 

이때 

A k; 라고 선언한 후에

k.a = 10;

k.b = 20;

 

이런식으로 자료형의 내부변수에 값을 읽거나 대입할 수 있다.

이 . 연산자가 = 연산자보다 우선된다는 의미이다.

 

만약 새로운 자료형 A 를 포인터로 선언하여 메모리르 할당한다면

A* k = new A();

이렇게 할당 할 수 있는데

이때에는

k->a = 10;

k->b = 20;

이런식으로 자료형의 내부변수에 접근 할 수 있다.

이 -> 연산자가 대입연산자보다 우선이 된다는 뜻이다.

 

4. ++ -- 연산자

int i = 0;

i++;

하거나

i--;

하게되면 i 가 1 증가하거나 1 감소하게 된다.

이것은 (후위) 이고

++i; 또는 --i; 로 표현할 수 있는데

이것이 (전위)이다

 

만약

int i=0;

int num = i++;

하게 되면 num 에 i 의 값(0) 이 대입된 후에 i 가 1 증가하게 되고.

int i=0; 

int num = ++i;

하게 되면 i 의 값이 1 증가 한 후에 num 에 i 값이 대입되게 된다.

(-- 도 동일)

 

또한 포인터 변수일 경우에 ++ 는 다음 주소로 이동 -- 는 이전 주소로 이동을 의미하게 된다.

 

5. sizeof 연산자

int i = sizeof(int);

int 는 4byte 크기의 자료형이므로 sizeof(int)는 4를 나타내고

i 에는 4가 대입된다.

 

6. & 연산자

int num = 10;

int* p = #

할때 & 연산자를 의미하며, 여기에서는 &num 는 num 의 주소값을 의미한다.

void Fuction(int &a)

{

}

라는 함수에서의 &는 레퍼런스의 의미를 갖는다.

나중에
Call By Value
Call By Reference
Call By Address
에 대해 알아보는 시간을 갖도록 하겠다.

 

7. * 연산자

int num = 10;

int* p = #

*p = 20;

할때 * 연산자를 의미하며, 여기에서는  int* 는 포인터 변수를 의미하고,

*p 는 주소의 메모리 공간을 의미한다. 여기에서는 num 를 의미한다.

 

8. 단항연산자 - +

int a = 10;

int b = -a;

int c = +a;

라고 할때, 단항연산자의 - 는 부호를 바꿔주고, +는 의미를 명확하게 하기 위해 쓰인다.

실제로 단항 연산자 + 는 코드를 명확하게 하기 위함이 아니라면 쓸일이 없다고 보면 된다.

 

9. ~ 연산자

int a = 3;

int b = ~a;

~ 연산자는 비트 단위로 0 을 1로 바꾸고, 1을 0으로 바꾸는 연산자이다

3 은 이진수로 00000000000000000000000000000011 이다(4byte모두 표기했음)

~3 은 이진수로 11111111111111111111111111111100 이다

이값은 -4 이다.

00000000000000000000000000000000 이것이 0 이고 -1 하면

11111111111111111111111111111111 이 된다.(-1) 여기에서 -1을 더 하면

11111111111111111111111111111110 이 되고 (-2) 여기에서 -1을 더 하면

11111111111111111111111111111101 이 되고(-3) 여기에서 -1을 더 하면

11111111111111111111111111111100 이 된다(-4)

 

10. ! 연산자

! 연산자는 참은 거짓으로 만들고

거짓은 참으로 만드는 연산자 이다.

C 언어에서 거짓은 0을 의미하고, 참은 0이 아닌수를 의미한다.

int a = 3;

int b = !a;

printf("%d\n", b);

//결과 0
int a = 0;

int b = !a;

printf("%d\n", b);

//결과 1

 

11. 형식 캐스팅

아래와 같이 형 변환을 할 때 사용합니다.

char a = 10;
int b = (char)a;
		
printf("%d\n", b);
// 결과 10

 

12. 산술연산자(승제연산자) * / %

int a = 10;

int b = 5;

int c = a * b;

int d = a / b;

int e = a % b;

여기에서 * 는 수학에서의 곱셉을 의미하고, / 는 수학에서 나누기를 의미한다.

% 는 나누어서 나머지를 의미한다.

10 % 5 = 0 (10을 5로 나누었을 때 나머지는 0 이다)

10 % 3 = 1 (10을 3으로 나누었을 때 나머지는 1 이다)

 

13. 산술연산자(가감연산자) - +

int a = 10;

int b = 7;

int c = a+b;

int d = a-b;

라고 할대 여기에서 - 나 + 는 산술연산자로 쓰인다.

 

14. 시프트 연산자 <<  >>

int a = 3;

int b = a << 1;

int c = a >> 1;

3 을 이진수로 표현하면 11 이다

11 << 1 을 하면 왼쪽으로 1 비트씩 이동하라는 뜻으로

110 이 된다. 즉 6이 된다.

11 >> 1 을 하면 오른쪽으로 1 비트씩 이동하라는 뜻으로

1 이 된다. 즉 1이 된다.

 

ex)

int a = 1;

int b = a << 2;

1 은 이진수로도 1 이고

1 << 2 는 왼쪽으로 2비트 이동하라는 뜻으로

100  이 되어 4 가 된다.

 

15. 비교 연산자 < > <= >=

int a = 3;
int b = 5;

int c = a < b;
printf("%d\n", c);
// 결과 1

int d = a > b;
printf("%d\n", d);
// 결과 0

int e = a <= b;
printf("%d\n", e);
// 결과 1

int f = a >= b;
printf("%d\n", f);
// 결과 0

16. 등가 연산자 == !=

== 같으면

!= 같지 않으면

int a = 3;
int b = 3;

if (a == b)
{
	printf("%d\n", a == b);
}
// 결과 1

!= 는 생략

 

17. 비트 연산자 & | ^

// & 비트연산자는 두 비트를 비교해서 둘다 1이면 1 이되고 그렇치 않으면(하나라도 0이면) 0 이 된다.

0 & 0 = 0

1 & 0 = 0

0 & 1 = 0

1 & 1 = 1
char a = 7;
char b = 2;

char c = a & b;
printf("%d\n", c);
// 결과 2

7 은 이진수로 00000111 이며, 2는 이진수로 00000010 이다.

   00000111

& 00000010

---------------

   00000010

 

// | 비트연산자는 두 비트를 비교해서 둘중 하나이상 1이면 1이 된다.

0 | 0 = 0

1 | 0 = 1

0 | 1 = 1

1 | 1 = 1
char a = 7;
char b = 2;

char c = a | b;
printf("%d\n", c);
// 결과 7

00000111     (7의 이진수)

00000010     (2의 이진수)

00000111     (7 | 2 의 결과)

 

// ^ 비트연산자는 두 비트를 비교해서 두 비트가 다르면 1 같으면 0 이 된다.

0 ^ 0 = 0

1 ^ 0 = 1

0 ^ 1 = 1

1 ^ 1 = 0
char a = 7;
char b = 2;

char c = a ^ b;
printf("%d\n", c);
// 결과 5

00000111     (7의 이진수)

00000010     (2의 이진수)

00000101     (7^2의 결과)

 

18. 논리 연산자 && ||

A && B 일때 A 와 B 가 모두 참일 때 참

A || B 일때 A 와 B 중 하나이상이 참일 때 참

char a = 7;
char b = 2;

if (a != b && a >= b)
{
	printf("만족합니다");
}
// 결과 만족합니다

a != b 가 참이고, a >= b 가 참이므로

a != b && a >= b 는 참

char a = 7;
char b = 2;

if (a != b || a <= b)
{
	printf("만족합니다");
}
// 결과 만족합니다

if ( 참 || 거짓 )

if ( 참 )

이 되어 결과는 만족합니다가 출력됩니다

 

19. 조건 연산자 ? :

(조건) ? (참일때처리) : (거짓일때처리)

int a = 10;
a == 10 ? printf("a==10") : printf("a!=10");

결과 : a==10 이 출력됨

 

20. 대입연산자 =  +=  -=  *=  /=  %=  <<=  >>=  &=  ^=  |=

int a = 10;
// a 에 10이 대입된다.
a += 10;
// a = a + 10; 과 같은 의미
a -= 10;
// a = a - 10; 과 같은 의미
a *= 10;
// a = a * 10; 과 같은 의미
a /= 10;
// a = a / 10; 과 같은 의미
a %= 10;
// a = a % 10; 과 같은 의미
a <<= 10;
// a = a << 10; 과 같은 의미
a >>= 10;
// a = a >> 10; 과 같은 의미
a &= 10;
// a = a & 10; 과 같은 의미
a ^= 10;
// a = a ^ 10; 과 같은 의미
a |= 10;
// a = a | 10; 과 같은 의미

21. 콤마 연산자 ,

int a=10, b=20;
// 변수 a 에 10을 대입, 변수 b 에 20을 대입

for (int i = 0, j = 0; i < 10; i++, j++)
{
	printf("%d, %d\n", i, j);
}
// 변수 초기화 i=0, j=0
// 조건 i < 10 일 때까지
// 증가 i++, j++
반응형

'C언어(2020년)' 카테고리의 다른 글

21. 구조체  (0) 2020.11.03
20. bool 자료형  (0) 2020.11.03
18. 연산자 우선순위  (0) 2020.11.03
17. 포인터  (1) 2020.11.03
16. RAM 에 대한 고찰  (0) 2020.11.03