常用的有#define #if defined #else #pragma LINE FUNCTION FILE 等
关于#define,在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。
关于inline:
慎用内联
内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。
参考:http://blog.sina.com.cn/s/blog_654a28bb0100xsmh.html
课后习题
第四题:编写一个函数,接受一个时间延迟数作为参数,然后运行一个循环,直至这段时间过完;
#include <stdio.h>
#include <time.h>
void delay(double time);
int main(void)
{
double time;
printf("input a time(in seconds) to delay(q to quit):");
while( scanf("%lf",&time) == 1 )
{
delay(time);
printf("time is out!\n");
printf("input a time(in seconds) to delay(q to quit):");
}
}
void delay(double time)
{
double origin;
origin = clock() / CLOCKS_PER_SEC ;
while(clock() / CLOCKS_PER_SEC < origin + time);
}
补充:
// 定时、延时
#include "stdafx.h"
#include <windows.h>
#include <time.h>
static int sleepTime = 0;
bool steper(int checkTime)
{
int stepTime = 10; // 毫秒
if (sleepTime < checkTime)
{
Sleep(stepTime);
sleepTime += stepTime;
return true;
}
else
{
sleepTime = 0;
return false;
}
}
int main()
{
clock_t start = clock();
while(steper(1120));//延迟时间1.12s
clock_t end = clock();
float count = ((float)end - (float)start)/ CLOCKS_PER_SEC; //注意转float
printf("time is %f's \n\n", count);
}
第七题:提供show_array()和new_d_array()的代码,使程序完整;
new_d_array()函数接受一个int参数和数量可变的double参数。该函数返回一个指向malfoc()分配的内存块的指针。
int参数指定动态数组中的元素个数:double值用于初始化元素(第个值赋予第一个元素,依此类推);
// 可变参数函数的赋值和显示:
void show_array(const double ar[], int n);
double* new_d_array(int n, ...);
int main()
{
double* p1;
double* p2;
p1 = new_d_array(5, 1.2, 2.3, 3.4, 4.5, 5.6);
p2 = new_d_array(4, 100.0, 20.00, 8.08, -1890.0);
show_array(p1, 5);
show_array(p2, 4);
free(p1);
free(p2);
return 0;
}
double* new_d_array(int n, ...)// 指向malloc()内存块,需要free;
{
va_list ap;
double* num = (double*)malloc(n * sizeof(double));
int i;
va_start(ap, n);// 可变参数个数n赋值给p
for (i = 0; i < n; i++)
{
num[i] = va_arg(ap, double);
}
//num[i] = '\0';
va_end(ap);
return num;
}
void show_array(const double ar[], int n)
{
const double* show_num = ar;
for (int i = 0; i < n; i++)
{
printf("%.3f", show_num[i]);
putchar(' ');
}
putchar('\n');
}