본문 바로가기

Programming languages/C

3. C언어(수식과 연산자)

728x90
반응형

수식은 연산자와 피연산자로 이루어진다고 앞에서 간단히 다루어 봤다.

3.14 * r에서 3.14와 r은 피연산자, *은 연산자이다.

 

#include <stdio.h>

int main()
{
    int x = 10;
    int y = 3;
    printf("%d\n",x/y); //소수점 이하 절삭 3

    double a = 10;
    double b = 3;
    printf("%lf",a/b); // 3.333333
}
#include <stdio.h>

int main() {
    int x = 10;
    int y = -x; // y = -10

    printf("%d", x - y); //10-(-10) = 20
}

#include <stdio.h>

int main() {
    int x = 10;
    int y = 10;

    int nx = x++;
    int ny = ++y;

    printf("%d %d",nx,ny); //nx = 10, ny = 11
}

증감 연산자는 x++ 의 경우 x를 먼저 사용한 후 즉 main 함수 내에서 printf 함수를 실행하고 난 후에 값이 증감하고, ++y의 경우는 먼저 y의 값을 증감시키고 printf 함수를 실행한다.

 

#include <stdio.h>

int main() {
    int x = 10;
    int y = x;
    ++x;
    x += 1; //복합 대입 연산자
    printf("%d %d",x,y); //12,10
}

이는 파이썬과 상당히 다른 부분이다. 파이썬에서 '='의 의미는 해당 값이 존재하는 메모리 주소를 가리키는 것을 의미한다. 그래서 y=x에서 x의 값이 변한다면 y의 값에도 동일하게 영향을 미친다. c언어에는 포인터의 개념이 따로 존재하기 때문에 변수에 할당되는 것이 메모리의 주소가 아니라 값이 메모리에 직접 복사되는 것이라고 유추할 수 있다.

 

#include <stdio.h>

int main() {
    int x = 10;
    int y = 10;
    int z = 33;

    x += 1; //11
    y *= 2; //20
    int a = z %= x+y; // 33 % (11+20) = 2

    printf("%d %d %d",x,y,a);
    
    return 0;
}

형 변환)

공부를 좀 하다 보면 알겠지만 C언어는 자료형에 굉장히 민감하다. 이러한 부분은 프로그램 작동에서 치명적인 오류를 현저하게 줄여준다는 장점이 있을 것으로 생각한다. 그러나 개발자 입장에서는 자료형을 하나하나 적어주는 게 귀찮고 프로그래밍할 때 복잡해지는 경우가 많다. 이를 조금이나마 해소해주는 방법으로 형 변환이 있다. 이는 연산 시 데이터의 유형이 변환되는 것을 의미한다.

#include <stdio.h>

int main() {
    int x = 10;
    int y = 10;
    double z;
    z = x+ y;
    printf("%lf\n",z); //20.0000
    printf("%d\n",z); // 0

    int i = 3.141592;
    printf("%d\n",i); //3
    printf("%lf\n",i); //0.0000
    
    return 0;
}

위의 z의 경우 올림 변환, i의 경우는 내림 변환이 된다. 또한 선언한 변수의 자료형과 일치하는 경우에만 printf에서 옳게 출력된다.

 

#include <stdio.h>

int main() {
    char x = 10;
    char y = 15;
    double d = 0.123456;
    char k = 'c';

    (int)x; //명시적 형변환
    (double)y; //명시적 형변환
    (int)k; //문자형을 정수형으로 형변환 가능 아스키 코드에 의거
    printf("c:%d, 99:%c\n",k,99);
    
    char a = x+y;
    int b = x+y;

    printf("%d %d %lf",a,b,x+d);//25 25 10.123456

    return 0;
}

정수 연산 시 char, short 형의 경우 자동적으로 int형으로 변환하여 계산한다.

x+d의 연산을 보면 x는 char -> int -> double로 바뀌어서 d와 연산이 된다.

형 변환의 경우 더 큰 자료형(더 자세한 값을 가지는 자료형)으로 자동적으로 형 변환된다.

문자형을 정수형으로 형 변환하는 것도 가능하고 그 역도 가능하다. k를 통해서 문자형의 형 변환을 보였다.

% d를 이용해서 0과 1로 참 거짓 값을 반환받을 수 있다. 실수형 데이터는 오차가 존재하기 때문에 관계 연산자의 반환 값이 옳지 않을 확률이 매우 높기 때문에 주의해야 한다.

#include <stdio.h>

int main()
{
    unsigned char num1 = 3;     //  3: 0000 0011
    unsigned char num2 = 24;    // 24: 0001 1000

    printf("%u\n", num1 << 3);  // 24: 0001 1000: num1의 비트 값을 왼쪽으로 3번 이동
    printf("%u\n", num2 >> 2);  //  6: 0000 0110: num2의 비트 값을 오른쪽으로 2번 이동

    return 0;
}

 

728x90
반응형

'Programming languages > C' 카테고리의 다른 글

6. C언어(함수 & 변수)  (0) 2022.08.14
5. C언어(반복문)  (0) 2022.08.11
4. C언어(조건문)  (0) 2022.08.09
2. C언어(변수와 자료형)  (0) 2022.08.09
1. C언어(기본,함수,자료형)  (0) 2022.08.09