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被定义后,预处理器将丢弃所有的断言而不必从源文件中把所有的断言实际删除;