우리가 사용하는 프로그래밍 언어로 작성한 코드를 소스 코드라 하는데, 이를 컴퓨터가 이해할 수 있는 2진법으로 작성된 머신 코드로 바꾸기 위해서는 소스코드를 머신코드로 변환시켜주는 역할이 필요하다. 이러한 일을 수행하는 프로그램을 컴파일러라 한다.
터미널창에 $ 기호 옆에 원하는 명령어를 입력해서 사용한다.
$ clang hello.c
📝 컴파일러와 인터프리터의 차이
컴파일러는 사람이 작성한 소스코드를 한 번에 머신코드로 번역하는 반면, 인터프리터는 즉석으로 한 줄씩 실행을 하면서 번역한다.
번역 시간 자체는 컴파일러가 오래 걸리지만, 번역이 완료되면 실행 파일이 따로 생성이 되어 계속 사용할 수 있기 때문에 실행 시간이 상대적으로 빠르다. 반면 인터프리터는 실행 때마다 매번 번역되어야 하기 때문에 컴파일러를 사용하는 언어에 비해 실행 속도가 느리다.
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
}
int main(void)
는 코드 실행을 위한 시작을 의미한다.
우리가 작성하는 실행 코드들은 모두 이 int main(void) {}
의 중괄호 사이에 작성하게 된다.
변수가 들어 있는 이름을 출력할 때는 %를 사용한다.
get_string("What's your name?\n");
printf("hello, %s\n", answer);
문자열을 받을 것이므로 string(문자열)의 s를 %뒤에 붙여서 파라미터를 받아준다.
x = x + 1; // 할당 연산자
x == y; // 일치 연산자 (bool)
할당 연산자 =
는 오른쪽에서 왼쪽으로 이동
일치 연산자 ==
는 좌항과 우항의 값이 서로 일치하는 지를 평가
코드를 간결하게 만드는 것 => 효율성과 얼마나 적은 메모리, CPU를 사용해서 수행하는 것이 중요
조건의 끝에는 세미콜론(;)을 붙이지 않음
int는 대략 40억까지 셀 수 있기 때문에 일반적으로 대부분 정수에 int를 사용한다.
printf 함수에서는 각 데이터 타입을 위한 형식 지정자를 사용할 수 있다.
#include <cs50.h>
#include <stdio.h>
int get_positive_int(void);
int main(void)
{
int i = get_positive_int();
printf("%i\n", i);
}
int get_positive_int(void)
{
int n;
do
{
n = get_int("Positive Integer: ");
}
while (n < 1);
return n;
}
get_postive_int라는 함수는 입력을 받지 않은 상태이다.
만약 이 전에 사용했던 get_int나 get_string 함수처럼 어떤 값을 받아와서 변수에 저장하는 것처럼 이 함수가 뭔가를 반환하게 하고 싶을 때는 함수 왼쪽의 void
를 int
로 바꿔주면 된다. 함수 왼쪽에 있는 단어는 출력의 종류를 의미한다.
int get_positive_int(void) 괄호 안의 void
는 입력의 종류를 뜻한다. 만약 입출력이 없다면 void를 적어주면 된다.
사용자 정의 함수는 코드를 간결하게 만들 수 있고, 수정과 재사용이 용이하다는 장점이 있다.
여러 함수들을 모아둔 것을 말한다. C에는 표준 라이브러리가 있는데, 강의에서 사용한 #include<stdio.h>
도 표준 라이브러리 중 하나이며 가장 보편적으로 사용된다. 그 밖에도 <math.h>, <time.h> 등 자신이 코딩하는데 필요한 함수들을 그때 그때 라이브러리를 불러와서 다른 사람들이 만들어둔 함수를 사용할 수 있다.
컴퓨터가 실수를 표현하는 방법은 정수보다 복잡하다. 실수를 정수와 마찬가지로 2진수로만 표현해야 하기 때문이다. 이로 인해 사용되는 방식 중 하나가 바로 부동 소수점(floating point) 방식인데, 지수의 값에 따라 소수점이 움직인다. 1/7, 0.1과 같은 소수들은 2진법으로 표현할 방법이 존재하지 않기 때문에, 컴퓨터는 그 값과 가장 근사한 값을 반환하게 된다.
x: 1
y: 10
x/y = 0.10000000149011611938476562500000000000000000000000
1/10은 원래 0.1의 결과값이 나와야 하지만, 이러한 이유로 다소 부정확한 결과를 나타내게 된다.
정수의 데이터 타입 크기는 고정되어 있는 상태에서 저장할 수 있는 크기보다 큰 수를 저장하려 할 때 에러가 발생하게 되는데, 이를 정수의 오버플로우라 한다.