C的源程序在进行编译之前要经过“预处理”,预处理程序主要完成以下三种功能
(1)宏替换 (2)文件包含 (3)条件编译(大软件开发)
注意:
1),宏定义不是以分号结束的
2), #define string1 string2之间至少有一个空格
3), string1称为宏,string2称为宏扩展
由"#"开始的命令是预处理程序处理的命令
===========================================================
//预处理程序将不替换字符串中或用单引号括起来的字符常量的'宏'
//下面程序输出结果是bonjour 和b
#define HELLO "bonjour\n"
#define A 'b'
#include<stdio.h>
int main()
{
printf(HELLO);
printf("%c\n",A);
return 0;
}
----------------------------------
//但这里的程序不会宏替换 输出结果为HELLO 和A
#define HELLO "bonjour\n"
#define A 'b'
#include<stdio.h>
int main()
{
printf("HELLO\n");
printf("%c\n",'A');
return 0;
}
==============================================================
//#define 宏 宏扩展(相当于字符串而不是表达式不能直接算出它的值)
//所以下面的程序应这样计算(2+1+1)*2+1/2=8 而不是(2+1+1)*(2+1)/2=6
#define N 2
#define M N+1 //N+1是字符串 而不是表达式
#define NUM (M+1)*M/2
#include<stdio.h>
int main()
{
printf("NUM的值=%d\n",NUM);
return 0;
}
===================================================================
//带有参数的宏替换
//#define 宏名(参数表) 字符串
//(字符串中要包含参数表中指定的参数)
//宏定义中的“宏名”和“(参数表)”之间不能有空格
#define area(x)(3.1415926536*x*x)
#include<stdio.h>
int main()
{
printf("%f\n",area(2.5));//area(2,5)称为宏调用
return 0;
}
---------------------------------------------------
//带参数的宏调用和函数调用有时实现的功能差不多但二者是完全不同的,
//宏调用效率更高
//宏调用是在编译之前完成的,
//函数调用是在编译之后实现的。
//下面程序中主程序占用2个字节(i),调用的square函数占用2个字节(n)
//调用square函数10次则整个程序的运行需要22个字节空间
#include<stdio.h>
int main()
{
int i=1;
int square(int);
while(i<=10)
printf("%d\n",square(i++));
return 0;
}
square(int n)
{
return n*n;
}
-------------------------------------------
#########
//下面的宏调用不管调用多少次整个程序的运行只需要2个字节空间
//这里的i++有疑问?
#define square(n) ((n)*(n))
#include<stdio.h>
int main()
{
int i=1;
while(i<=10)
printf("%d\n",square(i++));
return 0;
}
===========================================================
// 取消已有的宏定义命令:#undef 宏名
// 作用:在#undef行后面出现的“宏名”将不被扩展
#include<stdio.h>
#define p 3.14
int main()
{
float r=2.0;
printf("%f\n",p*r*r); //输出结果为12.560000
#undef p
int p=10;
printf("%d\n",p); //输出结果为10
return 0;
}
==============================================================
//注意printf函数的使用及scanf函数的使用
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d\n",a); //输出结果为1
return 0;
}
------------------------------
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d" "\n",a); //这里“"%d" "\n"”中间有无空格都可以
//输出结果为1
return 0;
}
---------------------------------------------
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d " "%d " "%d " "\n",a,b,c);//输出结果为1 2 3
return 0;
}
--------------------------------------------------
//scanf()函数
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d" "%d" "%d",&a,&b,&c); //“"%d" "%d" "%d"”中间有无空格都可以
printf("%d " "%d " "%d " "\n",a,b,c);
return 0;
}
========================================================
//文件包含:是指一个源文件可以将利用另外一个源文件的
//全部内容包含进来。其一般形式为:
//#include"文件名" / #include<文件名>
//功能:把指定文件的内容插入到该#include命令所在之处。
//如下面两个程序片段
-------------------------
// 文件print.h
#define PR printf
#define NL "\n"
#define D "%d"
#define D1 D NL
#define D2 D D NL
#define D3 D D D NL
------------------------------------
//文件file.cpp
#include<stdio.h>
#include"print.h" //包含print.h文件,注意要用双引号
int main()
{
int a=1,b=2,c=3;
PR(D1,a);
PR(D2,a,b);
PR(D3,a,b,c);
}
----------------------------------------------
说明:
1):由于#include命令常出现在源文件的头部。所以我们也称被包含进
来的文件为“头文件”。
2):C编译系统本身也提供有许多这样的头文件。如:stdio,h,string.h, math.h。
3):一个#include命令只能指定一个被包含的文件。
4):#include也可以嵌套。但不能递归包含。
===============================================================
//常用的一些宏(定义系统文件)
#define BUFSIZE 128 (系统缓冲区空间为128)
#define EOF '-1' (文件结束为 -1)
#define FALSE 0 (把假定义成0)
#define TRUE 1 (把真定义成1)
#define NULL '\0'
#define BELL 7 (响铃)
#define ESC 27
#define BLANK 32
===================================================================
//条件编译:有时希望程序其中的一部分只有在满足一定条件时才进行编译,
//否则不参与编译。(一般用在大的软件开发之中)
//条件编译有以下几种形式
// #if 常量表达式
程序段
#endif
作用:如果常量表达式为真(非零),则相应的程序段被编译。否则跳过它。
========================================================================
//产生随机数函数的使用
//srand() rand() random() randomize()
/*
void srand(unsigned int seed);使用变量seed作为种子初始化随机数产生器,只要
传入相同的seed,后面的rand函数就产生相同的数据,可以把系统时间作为种子;
如果在调用rand函数之前没有调用srand(),就同事先调用srand(1)是一样的。
------srand((unsigned)time(NULL));
*/
/*
int rand(void);返回一个在0--RAND_MAX之间的一个随机整数,RAND_MAX常量在
stdlib.h中被定义:为 32767;在第一次调用rand函数之前应该调用srand()
函数初始化随机数产生器。
*/
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
printf("%d\n",rand());
srand(1);
printf("%d\n",rand());//和上面输出是一样的而且每次运行都输出相同的值
srand((unsigned) time(NULL));//初始化随机数种子,取系统时间为参数
printf("%d\n",rand());//这行输出和下面不同而且每次运行都输出不相同的值
printf("%d\n",rand());
return 0;
}
-------------------------------------------------------
random()及randomize()在TC中使用在VC++中不兼容
//randomize()函数相当于VC++中的srand()函数,初始化随机数种子,
//而random(参数n)函数则产生随机数,随机数的范围是0——(n-1);
#include<stdio.h>
#include<stdlib.h>
int main()
{
randomize();//初始化随机数种子,不要参数
printf("%d\n",random(10));//产生0--9之间的随机数
return 0;
}
===========================================================================
(1)宏替换 (2)文件包含 (3)条件编译(大软件开发)
注意:
1),宏定义不是以分号结束的
2), #define string1 string2之间至少有一个空格
3), string1称为宏,string2称为宏扩展
由"#"开始的命令是预处理程序处理的命令
===========================================================
//预处理程序将不替换字符串中或用单引号括起来的字符常量的'宏'
//下面程序输出结果是bonjour 和b
#define HELLO "bonjour\n"
#define A 'b'
#include<stdio.h>
int main()
{
printf(HELLO);
printf("%c\n",A);
return 0;
}
----------------------------------
//但这里的程序不会宏替换 输出结果为HELLO 和A
#define HELLO "bonjour\n"
#define A 'b'
#include<stdio.h>
int main()
{
printf("HELLO\n");
printf("%c\n",'A');
return 0;
}
==============================================================
//#define 宏 宏扩展(相当于字符串而不是表达式不能直接算出它的值)
//所以下面的程序应这样计算(2+1+1)*2+1/2=8 而不是(2+1+1)*(2+1)/2=6
#define N 2
#define M N+1 //N+1是字符串 而不是表达式
#define NUM (M+1)*M/2
#include<stdio.h>
int main()
{
printf("NUM的值=%d\n",NUM);
return 0;
}
===================================================================
//带有参数的宏替换
//#define 宏名(参数表) 字符串
//(字符串中要包含参数表中指定的参数)
//宏定义中的“宏名”和“(参数表)”之间不能有空格
#define area(x)(3.1415926536*x*x)
#include<stdio.h>
int main()
{
printf("%f\n",area(2.5));//area(2,5)称为宏调用
return 0;
}
---------------------------------------------------
//带参数的宏调用和函数调用有时实现的功能差不多但二者是完全不同的,
//宏调用效率更高
//宏调用是在编译之前完成的,
//函数调用是在编译之后实现的。
//下面程序中主程序占用2个字节(i),调用的square函数占用2个字节(n)
//调用square函数10次则整个程序的运行需要22个字节空间
#include<stdio.h>
int main()
{
int i=1;
int square(int);
while(i<=10)
printf("%d\n",square(i++));
return 0;
}
square(int n)
{
return n*n;
}
-------------------------------------------
#########
//下面的宏调用不管调用多少次整个程序的运行只需要2个字节空间
//这里的i++有疑问?
#define square(n) ((n)*(n))
#include<stdio.h>
int main()
{
int i=1;
while(i<=10)
printf("%d\n",square(i++));
return 0;
}
===========================================================
// 取消已有的宏定义命令:#undef 宏名
// 作用:在#undef行后面出现的“宏名”将不被扩展
#include<stdio.h>
#define p 3.14
int main()
{
float r=2.0;
printf("%f\n",p*r*r); //输出结果为12.560000
#undef p
int p=10;
printf("%d\n",p); //输出结果为10
return 0;
}
==============================================================
//注意printf函数的使用及scanf函数的使用
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d\n",a); //输出结果为1
return 0;
}
------------------------------
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d" "\n",a); //这里“"%d" "\n"”中间有无空格都可以
//输出结果为1
return 0;
}
---------------------------------------------
#include<stdio.h>
int main()
{
int a=1,b=2,c=3;
printf("%d " "%d " "%d " "\n",a,b,c);//输出结果为1 2 3
return 0;
}
--------------------------------------------------
//scanf()函数
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d" "%d" "%d",&a,&b,&c); //“"%d" "%d" "%d"”中间有无空格都可以
printf("%d " "%d " "%d " "\n",a,b,c);
return 0;
}
========================================================
//文件包含:是指一个源文件可以将利用另外一个源文件的
//全部内容包含进来。其一般形式为:
//#include"文件名" / #include<文件名>
//功能:把指定文件的内容插入到该#include命令所在之处。
//如下面两个程序片段
-------------------------
// 文件print.h
#define PR printf
#define NL "\n"
#define D "%d"
#define D1 D NL
#define D2 D D NL
#define D3 D D D NL
------------------------------------
//文件file.cpp
#include<stdio.h>
#include"print.h" //包含print.h文件,注意要用双引号
int main()
{
int a=1,b=2,c=3;
PR(D1,a);
PR(D2,a,b);
PR(D3,a,b,c);
}
----------------------------------------------
说明:
1):由于#include命令常出现在源文件的头部。所以我们也称被包含进
来的文件为“头文件”。
2):C编译系统本身也提供有许多这样的头文件。如:stdio,h,string.h, math.h。
3):一个#include命令只能指定一个被包含的文件。
4):#include也可以嵌套。但不能递归包含。
===============================================================
//常用的一些宏(定义系统文件)
#define BUFSIZE 128 (系统缓冲区空间为128)
#define EOF '-1' (文件结束为 -1)
#define FALSE 0 (把假定义成0)
#define TRUE 1 (把真定义成1)
#define NULL '\0'
#define BELL 7 (响铃)
#define ESC 27
#define BLANK 32
===================================================================
//条件编译:有时希望程序其中的一部分只有在满足一定条件时才进行编译,
//否则不参与编译。(一般用在大的软件开发之中)
//条件编译有以下几种形式
// #if 常量表达式
程序段
#endif
作用:如果常量表达式为真(非零),则相应的程序段被编译。否则跳过它。
========================================================================
//产生随机数函数的使用
//srand() rand() random() randomize()
/*
void srand(unsigned int seed);使用变量seed作为种子初始化随机数产生器,只要
传入相同的seed,后面的rand函数就产生相同的数据,可以把系统时间作为种子;
如果在调用rand函数之前没有调用srand(),就同事先调用srand(1)是一样的。
------srand((unsigned)time(NULL));
*/
/*
int rand(void);返回一个在0--RAND_MAX之间的一个随机整数,RAND_MAX常量在
stdlib.h中被定义:为 32767;在第一次调用rand函数之前应该调用srand()
函数初始化随机数产生器。
*/
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main()
{
printf("%d\n",rand());
srand(1);
printf("%d\n",rand());//和上面输出是一样的而且每次运行都输出相同的值
srand((unsigned) time(NULL));//初始化随机数种子,取系统时间为参数
printf("%d\n",rand());//这行输出和下面不同而且每次运行都输出不相同的值
printf("%d\n",rand());
return 0;
}
-------------------------------------------------------
random()及randomize()在TC中使用在VC++中不兼容
//randomize()函数相当于VC++中的srand()函数,初始化随机数种子,
//而random(参数n)函数则产生随机数,随机数的范围是0——(n-1);
#include<stdio.h>
#include<stdlib.h>
int main()
{
randomize();//初始化随机数种子,不要参数
printf("%d\n",random(10));//产生0--9之间的随机数
return 0;
}
===========================================================================