1. 1부터 100까지의 합을 구하는 가장 빠른 방법
가우스: 선생님 1과 100을 더하면 101 ... 그렇게 50+51은 101 이니까 101 곱하기 50이겠네요!
2. 2의 거듭제곱을 사용할 때 가장 좋은 방법
비트 연산자: Shift 비트 연산자 사용이 2의 거듭제곱을 구하는 가장 빠른 방법.
3. 몰랐던 문자열 검색 str 함수, strchr(), strstr()
strchr( 문자열, 문자 ) : 문자열 안에서 파라메터 문자로 시작하는 문자열 한 단어 추출.
strstr( 문자열, 문자열 ) : 문자열 안에서 파라메터 문자열로 시작해서 기존 문자열 끝(NULL)까지 추출.
4. 문자열 끝에 NULL이 들어가는 이유
문자열 끝에 NULL이 들어가는 이유는 char* 라는 포인터 형식으로 문자열을 받기 때문에 이 변수는
메모리 주소만을 기억하고 있다. 그래서 어디가 끝인지 알기위해서 맨 마지막엔 항상 NULL이 들어간다.
5. 방어적인 Programming 이란?
(1) 포인터 초기화
(2) 예외처리
(3) 디버그를 위한 asserte() 문 활용
방어적 Programming 기법을 항상 생활화하자!
6. 함수 포인터
필요한 이유
(1) 함수를 배열 또는 구조체에 넣거나
(2) 함수 자체를 함수의 매개변수로 넘겨주기 위해서
함수 포인터 기본 형태
void (*fp)() = 함수 이름;
반환값과 매개변수가 존재하는 함수 포인터
int *(fp)(int , int) = 함수 이름;
*함수 포인터를 활용하여 C언어로도 객체지향 프로그래밍을 할 수 있다.
7. 매크로 안에서 변수 선언 기법
do ~ while() 문을 활용하여 매크로 안에서 변수를 선언할 수 있다.
매크로의 do 부분에서 변수를 선언하고 이를 while() 구문 안에서 활용 가능.
8. 매트로를 활용하여 부분 Complie이 가능
#ifdef 매크로 이름
코드
#endif
9. const void * 의 뜻
void *가 상수이므로 프로그래머가 임의로 변경할 수 없음.
10. volatile 키워드
volatile은 변수에 사용할 때 항상 메모리에 접근해라는 의미.
이것이 필요한 이유는 컴파일러는 당연한 논리는 최적화 시켜 움직인다.
즉, 메모리에 접근하지 않고 임의적으로 컴파일 과정에서 변경이 일어나는데 이 때,
계속 메모리의 값을 관찰하고 지켜봐야 할 경우에는 최적화 과정이 발생하면 안된다.
이런 일을 방지하기 위해서 volatile 키워드를 사용한다.
아마도 멀티 쓰레딩 기법에서 많이 필요로 할 듯 하다.
11. 매크로 함수 Inline 함수
함수는 호출 과정으로 인해 최소한의 오버헤드가 발생.
하지만 Inline 함수를 선언하여 사용하면 이 호출 과정이 생략되므로 빠르다.
그래서, Inline 함수는 속도가 필요한 부분에 사용되면 좋을 수 도 있다.
12. asserte() 문의 활용
asserte()문은 반드시라는 조건이 필요한 경우 작성하는 디버그 전용 문장이다.
assert.h 라이브러리에 정의되어 있고 사용 형태는 다음과 같다.
char * dest;
asserte( dest != NULL );
이 문장의 의미는 dest에 NULL이 들어가면 안된다는 의미.
만약 NULL이 들어가면 프로그램은 자동으로 종료된다.
프로 프로그래머들은 이 asserte() 문을 반드시 활용한다.
'테크 > 기초 지식' 카테고리의 다른 글
malloc() 과 new 연산자의 차이점 (0) | 2016.10.24 |
---|---|
if문과 논리연산자로 인한 조건 검사 순서의 비밀 - 컴파일러 (0) | 2016.10.07 |
재귀와 반복 그리고 꼬리 재귀 (2) | 2016.08.21 |
SW개발 지식 필기테스트 (8) | 2016.07.29 |
내가 알게된 좋은 프로그래밍 습관 (3) | 2016.05.06 |