반복 루프와의 첫 만남
// 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;
}
대입 연산자와 몇 가지 용어들
메모리에 있는 Object들을 Object Data라고 부른다.(int i
) 어떤 데이터가 메모리 안에 존재하고 있다면 그것이 Data object이다.
1024는 말 그대로 상수를 의미하지, 어떤 메모리 내 데이터를 의미하지 않는다. 반면에, i는 그러하다.
An lvalue
(locator value) represents an object that occupies some identifiable location in memory.
더하기, 빼기, 부호 연산자들
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;
}
곱하기 연산자
복리를 계산하는 연산자를 만들어보자.
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;
}
나누기 연산자
주의사항 위주로 설명 예정
결과를 보면 알 수 있듯이, 정수형에 소수가 들어갈 경우 값이 버려진다.
주의! 절대로 이들은 반올림되지 않는다!
나머지 연산자
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하게 하는 방법을 알려줄 예정
증가, 감소, 연산자
변수에 앞에 붙는 연산자를 전위 연산자, 뒤에 붙는 연산자를 후위 연산자라고 부른다.
a = a + 1 과 같이 하지 않는 이유는 뭘까?
While 문과 같이 사용되는 경우
후위 연산자는 ( ) 내에서 비교를 진행한 후에, 덧셈 연산을 진행한다.
이렇게, 출력되는 값도 다르다는 것을 알 수 있다. i_post에는 i값을 대입하고 난 후에 i를 1증가시키기 떄문에, printf()를 해 보면, 1이 나온다.
감소 연산자도 원리는 증가 연산자와 동일하다!
동일하게, 후위 연산자이기 때문에 다음과 같은 결과가 나온다.
증가, 감소 연산자는 수정 가능한 연산자(L-value)에만 가능하다!
(x*y)
는 R value이기 때문에, 여기에는 증가, 감소 연산자를 적용하면 안된다.
이렇게 사용하면 안된다!
한 줄 내에 여러 번 변수가 사용될 떄는 결과가 다르게 나올 떄도 있다. 그렇기에 권장하지 않는다. 위험할 수도 있다!
tip: 코딩을 하다가 식이 너저분하게 될 수 있는데, 그럴 떄는 Ctrl + X를 누르고 Ctrl + v 를 누르면 Visual studio가 코드를 깔끔하게 정리하여 출력해 준다.
표현식과 문장(Expressions and Statements)
이들이 표현식이다.
x = 1 + (y = 5) ;
식을 보자.
왜 subexpression이라는 개념을 쓰는지는 다음 장에서 설명!
앞서 말했듯, 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;
몇 가지 예시를 함께 보자.
또한, c = 1106; 라인을 보면 c의 데이터 타입이 char이기 때문에 demolition이 발생한 것을 확인할 수 있다.
demolition -> 1106 = 0b10001010010 -> 0b10001010010 = 1106 % 256 = 82 ='R'으로 처리되기 때문에, R이 출력된다.
'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 |