티스토리 뷰

1. C 기초
Hello World!
#include <stdio.h>
int main(void){
printf("Hello World!");
return 0;
}
컴파일러
✔ 작성한 코드를 컴퓨터가 이해할 수 있는 2진수의 머신코드로 변환해 실행할 수 있는 실행파일을 생성하는 과정
✔ 실행 파일 : 컴퓨터가 이해할 수 있는 기계어 형태의 파일
2 . 문자열 출력
printf( )
✔ C언어의 표준 출력 함수로, 여러 종류의 데이터를 다양한 서식에 맞춰 출력할 수 있다.
✔ 기본적으로 문자열을 출력하기 위한 함수로 문자열 외의 형태를 출력하고자 할 때에는 형식 지정자가 필요하다
3. 조건문과 루프
if 문
✔ 조건식이 참인 경우 내부의 코드가 실행
#include <stdio.h>
int main(void){
int num = 2;
if(n%2==0) {
printf("%d는 짝수입니다\n"),num //2는 짝수입니다 출력
} else{
printf("%d는 홀수입니다\n"),num
}
return 0;
}
switch 문
✔ 조건 식의 결과에 따라 매치되는 case문의 코드가 실행
#include <stdio.h>
int main(void){
int num = 2;
switch(num){
case 1: printf("1입니다"); break;
case 2: printf("2입니다"); break; //2입니다 출력
case 3: printf("3입니다"); break;
default: break;
}
return 0;
}
for 문
✔ 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행
✔ for문의 초기식에서 변수를 선언하는 것은 C99의 방식 → 변수를 반복 내에서만 사용 가능
✔ for문 외부에서 변수를 선언하고, for문에서 초기화하는 것은 C99 이전의 방식
✔ GCC에서는 C99가 기본 설정이 아니므로, for문의 초기식에서 변수 선언했을 때 컴파일 에러 발생
#include <stdio.h>
int main(){
for (int i = 0; i < 10; i++){
printf("Hello, world!\n");
}
return 0;
}
while 문
✔ 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행
✔ 조건식이 참(true)인 경우 내부의 명령문을 실행
#include <stdio.h>
int main(){
int i=0;
while(i<10){
printf("Hello World!\n");
i++;
}
return 0;
}
4. 자료형, 형식 지정자
자료형
bool | 논리형 | true, false, 1 , 0 |
char | 문자형 | 'a', 'Z', '?' |
string | 문자열 | "Hello World" |
int | 정수형 | 5, 28, -3, 0 |
long | int보다 더 범위가 큰 정수 | |
float | 소수점을 갖는 실수 | 3.14, 0.0, -28.56 |
double | float보다 더 범위가 큰 실수 |
형식 지정자 (서식 지정자, 변환 문자)
형식 지정자 | 자료형 / 형태 | 형식 지정자 | 자료형 / 형태 |
%c | 문자(char) | %i | 10진, 8진, 16진 정수(int) |
%s | 문자열(string) | %li | 10진, 8진, 16진 정수(long) |
%d | 10진 정수(int) | %f | 실수(float) |
%ld | 10진 정수(long) | %lf | 실수(double) |
%lld | 10진 정수(long long) | %p | 주소 값, 포인터 |
%o | 8진 정수 | %e, %E | 부동 소수점 표현 실수 |
%x | 16진 정수 : 소문자 출력 | %u | unsigned int |
%X | 16진 정수 : 대문자 출력 | %lu | unsigned long |
5. 사용자 정의 함수, 중첩 루프
int main(void) { 명령문; return 0; }
✔ int는 최종으로 함수가 반환할 값의 자료형을 의미
✔ 아무것도 반환하지 않는다면 void를 사용
✔ 괄호 안의 void는 입력의 종류를 뜻하며 입력이 없는 경우 void 사용
✔ main함수보다 뒤에서 선언/정의된 함수는 main함수에서 인지하지 못하므로
✔ 선언은 main함수보다 위에, 정의는 main함수의 뒤에 하는것이 가독성이 높다
중첩 루프
✔ 반복문의 내부에 또 다른 반복문을 넣어 반복을 중첩 진행
#include <stdio.h>
int main(void){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("*");
}
printf("\n");
}
return 0;
}
6. 하드웨어의 한계
✔ RAM은 유한한 크기의 비트만을 저장할 수 있기 때문에 때로는 부정확한 결과를 내기도 한다
✔ 다루고자 하는 자료형의 범위를 유의해 프로그램을 작성하자
부동 소수점 부정확성
✔ float에서 저장 가능한 비트의 수가 유한하기때문에 부정확한 결과 반환
#include <stdio.h>
int main(void){
printf("%.50f",1/10); //0.10000000000000000555111512312578270211815834045410
return 0;
}
정수 오버플로우
✔ 선언한 자료형보다 크기가 큰 값을 저장한 경우, 오버플로우 발생
✔ 자료형의 범위를 벗어난 값은 오히려 최소값이나 0과 같은 부정확한 결과 반환
#include <stdio.h>
#include <unistd.h>
int main(void){
for (int i = 1; ; i *= 2){
printf("%i\n", i);
sleep(1);
}
}
역사적 사건 ① Y2K 문제
✔ 연도를 마지막 두 자리수로만 저장했던 관습
✔ 새해로 넘어가며, 99가 00으로 정수 오버플로우가 발생
✔ 2000년이 아닌 1900년으로 인식되는 문제
역사적 사건 ② 보잉 787 사건
✔ 비행기 보잉 787에서 구동 후 248일이 지나면 모든 전력을 잃는 문제
✔ 강제로 안전모드에 진입하였기 때문
✔ 소프트웨어의 변수가 248일이 지난 후, 오버플로우가 되어 발생한 문제
✔ 이를 해결하기 위해 주기적으로 재가동을 하여 변수로 다시 0으로 리셋
[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)
'Computer Science > CS50' 카테고리의 다른 글
[CS50 5주차] 2. 포인터 (0) | 2021.02.12 |
---|---|
[CS50 5주차] 1. 메모리 주소 (0) | 2021.02.12 |
[CS50 4주차] 알고리즘 (0) | 2021.02.12 |
[CS50 3주차] 배열 (0) | 2021.02.12 |
[CS50 1주차] 컴퓨팅 사고 (0) | 2021.02.11 |