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() 문을 반드시 활용한다.









+ Recent posts