본문 바로가기

Computer Science/따라하며 배우는 C

04 연산자

728x90

반복 루프와의 첫 만남



// Case 1: goto문

 int n = 1;

label:
 printf("%d\n", n);
 n = n + 1;

 if (n == 10) goto out;

 goto label; // 쓸일이 없을 것.

out:

 return 0;
 // Case 2: while 문
 int main()
{
 int n = 1;

 while (n < 11)
 {
  printf("%d\n", n);
  n = n + 1;
 }



 return 0;

}

대입 연산자와 몇 가지 용어들


image

메모리에 있는 Object들을 Object Data라고 부른다.(int i) 어떤 데이터가 메모리 안에 존재하고 있다면 그것이 Data object이다.

1024는 말 그대로 상수를 의미하지, 어떤 메모리 내 데이터를 의미하지 않는다. 반면에, i는 그러하다.

An lvalue (locator value) represents an object that occupies some identifiable location in memory.

image

더하기, 빼기, 부호 연산자들



int main()
{
 printf("%d\n", 1 + 2);

 int income, salary, bonus;

 income = salary = bonus = 100; //triple assignment

 salary = 100;
 bonus = 30;

 income = salary + bonus; // l-value vs r-value

 int takehome, tax;
 tax = 20;
 takehome = income - tax;

 int a, b;
 a = -7;
 b = -a;
 b = +a; // + does nothing

 return 0;

}

image

곱하기 연산자


복리를 계산하는 연산자를 만들어보자.


int main()
{
 double seed_money, target_money, annual_interest;

 printf("input seed_money");
 scanf("%lf", &seed_money);

 printf("input target money");
 scanf("%lf", &target_money);

 printf("input annual interest (%%)");
 scanf("%lf", &annual_interest);

 double fund = seed_money;
 int year_count = 0;

 while (fund < target_money)
 {
  fund += fund * annual_interest / 100.0;

  year_count += 1;

  printf("year %d, fund %f \n", year_count, fund);

 }

 printf("it takes %d years", year_count);

 return 0;


}

나누기 연산자


주의사항 위주로 설명 예정

image

결과를 보면 알 수 있듯이, 정수형에 소수가 들어갈 경우 값이 버려진다.

주의! 절대로 이들은 반올림되지 않는다!

image

나머지 연산자



int main()
{
 int seconds = 0, minutes = 0, hours = 0;
 printf("input seconds");
 scanf("%d", &seconds);

 while (seconds >= 0) // while 문은 한 번은 돌아야 하기 때문에, 앞에서 input을 받고, 마지막에 다시 다음 것에 대한 input을 받는다.
 {
  // Seconds -> hours, minutes, seconds

  minutes = seconds / 60;
  seconds %= 60;

  hours = minutes / 60;
  minutes %= 60;

  //print result

  printf("%d hours, %d minutes, %d seconds \n", hours, minutes, seconds);

  printf("input seconds");
  scanf("%d", &seconds);
 }

 printf("bye");

}

추후에 입력을 두 군데에서 듣지 않고도 잘 run하게 하는 방법을 알려줄 예정

증가, 감소, 연산자


변수에 앞에 붙는 연산자를 전위 연산자, 뒤에 붙는 연산자를 후위 연산자라고 부른다.

image

a = a + 1 과 같이 하지 않는 이유는 뭘까?

image

While 문과 같이 사용되는 경우

image

후위 연산자는 ( ) 내에서 비교를 진행한 후에, 덧셈 연산을 진행한다.

image

이렇게, 출력되는 값도 다르다는 것을 알 수 있다. i_post에는 i값을 대입하고 난 후에 i를 1증가시키기 떄문에, printf()를 해 보면, 1이 나온다.

image

감소 연산자도 원리는 증가 연산자와 동일하다!

image

동일하게, 후위 연산자이기 때문에 다음과 같은 결과가 나온다.

증가, 감소 연산자는 수정 가능한 연산자(L-value)에만 가능하다!

image

(x*y)는 R value이기 때문에, 여기에는 증가, 감소 연산자를 적용하면 안된다.

이렇게 사용하면 안된다!

한 줄 내에 여러 번 변수가 사용될 떄는 결과가 다르게 나올 떄도 있다. 그렇기에 권장하지 않는다. 위험할 수도 있다!

image

tip: 코딩을 하다가 식이 너저분하게 될 수 있는데, 그럴 떄는 Ctrl + X를 누르고 Ctrl + v 를 누르면 Visual studio가 코드를 깔끔하게 정리하여 출력해 준다.

표현식과 문장(Expressions and Statements)


image

이들이 표현식이다.

image

x = 1 + (y = 5) ; 식을 보자.

왜 subexpression이라는 개념을 쓰는지는 다음 장에서 설명!

image

앞서 말했듯, x=4 라는 expression의 주 효과는 값을 계산하는 것이다. Side effect로써 x라는 변수에 4라는 값이 대입되는 기능이 존재한다.

자료형 변환 (Type Conversions)



int main()
{

 /* promotions in assignments*/
 short s = 64;
 int i = s;

 float f = 3.14f;
 double d = f;

 /* demotion in assignments*/
 d = 1.25;
 f = 1.25;
 f = 1.123;

}
  • demotion: 데이터 크기가 더 큰 자료형을 -> 데이터 크기가 더 작은 자료형에 집어넣는 것

 /* ranking of types in opeartions*/
 // long double > double > float
 // unsigned long long, long long
 // unsigned long, long
 // unsigned, int
 // short int, unsigned short int
 // signed char, char, usigned char
 // _Bool
 // REF: Google 'integer conversion rank'

 d = f + 1.234;
 f = f + 1.234;
  • 자료형에는 Ranking이 있다!

Casting Operator<중요함>

다음과 같이, 사용자가 의도적으로 형 변환을 해줄 수 있다. 개발자의 의도를 명확하게 명시할 수 있다.


 /* Casting opeartors*/
 d = (double)3.14f;
 i = 1.6 + 1.7;
 i = (int)1.6 + (int)1.7;

image

몇 가지 예시를 함께 보자.

또한, c = 1106; 라인을 보면 c의 데이터 타입이 char이기 때문에 demolition이 발생한 것을 확인할 수 있다.

demolition -> 1106 = 0b10001010010 -> 0b10001010010 = 1106 % 256 = 82 ='R'으로 처리되기 때문에, R이 출력된다.

728x90

'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글

07 If문  (0) 2022.03.31
06 For  (0) 2022.03.31
03 문자열과 형식 맞춘 입출력  (0) 2022.03.03
02 데이터와 C언어  (0) 2022.03.03
01 C 언어를 소개합니다.  (0) 2022.03.03