못정함

C언어) 4-2장 : 그 외 유용한 연산자 본문

C언어 공부/C언어 독학 (교재)

C언어) 4-2장 : 그 외 유용한 연산자

hadara 2024. 9. 15. 01:05

형 변환 /  sizeof / 복합대입 / 콤마 / 조건

비트 

연산자 우선순위, 방향


<형 변환 연산자>

-피연산자를 하나 가짐
-피연산자의 값을 원하는 형태로 바꿈. ex) 정수형을 실수형으로 / 실수형을 정수형으로
-일시적으로 바꾸는 것임. 연산 후 메모리에 남아 있는 피연산자의 형태나 값은 변하지 X
int a = 10;

일 때

(double)10

하면 됨



-정수 부분만 추리고 싶을 때도 사용함 (소수점 이하의 값은 반올림X. 무조건 버림)

 

자동 형 변환

-피연산자가 2개 이상이면 피연산자의 형태가 같아야함.

-형태가 다르면 형태를 자동으로 일치시킴.

-데이터 크기가 작은 값이 크기가 큰 값으로 바뀜.

-정수(4byte) , 실수(8byte) ==> 실수로 자동 변환.

-대입 연산자는 무조건 좌항의 변수형에 맞게 저장됨

 

-웬만하면 네가 잘 맞추셈 첨부터.........

 


<sizeof 연산자>

-피연산자 하나
-피연산자의 크기를 byte 단위로 계산해서 알려줌

-데이터 크기 확인, 메모리 동적 할당 시 사용
-배열의 크기 확인
sizeof(피연산자)

-피연산자의 대상: 변수, 상수, 수식, 자료형 등

 


<복합대입 연산자>

- 연산 결과를 다시 피연산자에 저장하고 싶을 때 사용

- 저장되는 공간과 연산되는 공간이 다름
- 비트 연산자 / 대입 연산자와 결합되어 쓰이기도 함
<산술 복합대입 연산자>

+=
-+
*+
/+
%=
(연산자의 특징을 그대로 가진다)

왼쪽 피연산자는 반드시 변수
② 오른쪽 항의 계산이 모두 끝난 후, 가장 마지막에 복합대입 연산자를 계산

res *= b + 10 을 주목해라 / ②에 의해 저렇게 됨

 


<콤마 연산자>

-한 번에 여러 개의 수식을 차례로 나열해야 할 때 사용

-왼쪽부터 오른쪽으로 차례로 연산 수행
-오른쪽의 피연산자가 최종 결괏값이 됨

-대입 연산자보다 유일하게 우선순위가 낮은 연산자
-대입 연산자와 함께 사용할 땐 반드시 괄호를 써야함
-제어문에서 조건식을 나열하는 괄호 안과 같이 세미콜론 사용이 불가능한 구조에서 사용됨

ex)

for ( i=0, j=10; i < j; i++)
반복문에서 초깃값 설정하는 두 문장 (i=0, j=10)을 세미콜론으로 구분하면 에러가 나서 ,를 사용

아래 예시를 통해

res = (++a, ++b);

res = ++a, ++b;

의 차이를 살펴보자


<조건 연산자>

-유일한 삼항 연산자

? 와 : 기호를 함께 사용


-매크로함수에 사용하면 좋음
-가독성을 떨어뜨릴 가능성이 있음

(사실 상 제어문이라고 생각하셈)
(a > b) ? a : b


해석)
-첫 번째 피연산자(조건식)가 참이면 두 번째 피연산자가 결괏값이 됨
-첫 번째 피연산자(조건식)가 거짓이면 세 번째 피연산자가 결괏값이 됨


a > b가 참이면 a

a > b가 거짓이면 b



*조건 연산자의 피연산자에 대입식을 직접 사용할 수도 있음


res = (a > b) ? a : b;

를 이렇게도 쓸 수 있음 

(a > b) ? (res = a) : (res = b);


(a > b) ? (res1 = a) : (res2 = b);
처럼 결과 반영 대상이 다를 경우에 유용하겠죠?



*바로 printf 넣어도됨 (148p. 도전실전문제 / 4_dojun.c)

((BMI > 20.0) && (BMI < 25.0))
? printf("표준입니다."\n)
: printf(""체중관리가 필요합니다."\n);

되게 효율적이네


<비트 연산자>

& 논리곱
^ 배타적 논리합 연산자
| 비트별 논리합 연산자
~ 비트별 부정 연산자
<< 비트를 왼쪽으로 이동
>> 비트를 오른쪽으로 이동
#include <stdio.h>  

int main(void){

    int a = 10;
    int b = 12;

    printf("a & b : %d\n", a & b);
    printf("a ^ b : %d\n", a ^ b);
    printf("a | b : %d\n", a | b);
    printf("~a : %d\n", ~a);
    printf("a << 1 : %d\n", a << 1);
    printf("a >> 2 : %d\n", a >> 2);

    return 0;
     
}

 

결과

a & b : 8
a ^ b : 6
a | b : 14
~a : -11
a << 1 : 20
a >> 2 : 2

 

음...

필요할 때 공부하겠습니다...

지금은 아님


 

<연산자 우선순위와 연산 방향>

- 단항 > 이항 > 삼항
ex) 단항: ++ / 이항: * (피연산자 2개 필요)

- 산술 > (비트 이동 연산자) > 관계 > 논리


*대입 연산자, 단항 연산자는 오른쪽에서 왼쪽으로 연산 수행
ex) 
a = (b = c)
- ( (double) a )

-산술) +, - , *, / , %
-관계) >, <, ==, !=
-논리) && , || , !


헷갈리니까
괄호를 열심히 쓰자


그밖에...

 

&(주소 연산자) , *(간접 참조 연산자) ===> 9장(포인터)에서

.(멤버 접근 연산자), -> (간접 멤버 접근 연산자) ===> 17장(구조체)에서