1、rand與srand函數產生僞隨機數
int rand(void);
void srand(unsigned int seed);
rand返回一個範圍在0和RAND _MAX之間的僞隨機數,爲了避免程序每次運行時獲得相同的隨機數序列,可以使用srand函數對隨機數發生器進行初始化;
常用的技巧是使用每天的時間作爲隨機數發生器的種子:
srand((unsigned int )time(0));
2、處理日期和時間的函數位於<time.h>之中
(1)clock函數
clock_t clock(void);
clock函數返回從程序開始執行起處理器所消耗的時間;往往是返回一個數字,爲了將其轉換爲秒,需要將它除以CLOCKS_PER_SEC;
通常使用方法是兩個clock函數返回值相減得到運行時間;
(2)time函數
time_t time(time_t *returned_value);
time函數返回當前的日期時間;
注: 調用time函數兩次並把兩個值相減由此判斷期間所流逝的時間是很危險的操作方式;
(3)ctime函數與difftime函數
char *ctime(time_t const *time_value);
double difftime(time_t time1, time_t time2);
ctime函數參數是指向time_t的指針,並返回一個指向字符串的指針,字符串格式如下:
Sun Jul 4 04:02:48 1976\n\0
difftime函數計算time1-time2的差,並把結果轉換爲秒;
關於difftime的例子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
long i = 0;
double d;
time_t t1, t2;
time(&t1);
for (i = 0; i < 1000000000; i++ )
{
;
}
time(&t2);
d = difftime(t2, t1);
printf("%f\n", d);
return 0;
}
關於ctime的例子:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t1;
char *p;
time(&t1);
p = ctime(&t1);
printf("%s", p);
return 0;
}
(4)gmtime函數與localtime函數
struct tm *gmtime(time_t const *time_value);
struct tm *localtime(time_t const *time_value);
gmtime函數將時間值轉換爲UTC時間,localtime函數把時間轉換爲當地時間;
注:一個常見的錯誤忘了tm_year這個值與1900相加;
3、信號表示一個程序的執行期間可能發生的不可預料的事件;
4、當一個信號發生時系統所採取的缺省反應是由編譯器定義的,一般是終止程序,但是我們可以通過定義一個信號處理函數並使用signal函數對其進行設置,從而改變信號的缺省行爲;
5、處理信號
int raise(int sig);
void (*signal(int sig, void(*handler)(int)))(int);
raise函數用於顯式的引發一個信號;
signal是一個函數,返回一個函數指針,後者所指向的函數接受一個整型參數且沒有返回值;
6、volatile關鍵字防止編譯器以一種可能修改程序含義的方式“優化”程序;
7、終止執行函數
void abort(void);
void atexit(void(func)(void));
void exit(int status);
abort函數用於不正常的終止一個正在執行的程序;
atexit函數可以把一些函數註冊爲退出函數,當程序將要正常終止時(或者由於調用exit,或由於main函數返回),退出函數將被調用;
總之:當exit函數被調用時,所以被atexit函數註冊爲退出函數的函數將按照它們所註冊的順序被反序調用,然後所有用於流的緩衝區被刷新,所有打開的文件被關閉,用tmpfile函數創建的文件被刪除,然後退出狀態返回給宿主環境,程序停止執行;
8、斷言(<assert.h>)
void assert(int expression);
這是一個宏,當它被執行時,這個宏對表達式參數進行測試,如果它的值爲假,它就向標準錯誤打印一條診斷信息並終止程序;
注:
(1)assert只適用於驗證必須爲真的表達式;
(2)當NDEBUG被定義後,預處理器將丟棄所有的斷言而不必從源文件中把所有的斷言實際刪除;