c primer plus第16章总结:C预处理器和C库

常用的有#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');
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值