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');
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com