关于#define 的宏替换的一些问题
#define PI 3.14; int main() { double r = 10, s = 0; s = r * r * PI; s = PI * r * r; // s = 3.14; * r * r; printf("%f \n",s); return 0; }
在使用#define时 如 #define PI 3.14 最好不要写成 #define PI 3.14;
这样程序在预编译的时候 进行宏替换 会将PI 直接替换成 3.14;当 s=r*r*PI; 时会替换成 s=r*r*3.14;;程序运行时只是产生了空语句,不进行语法报错,而 s=PI*r*r; 时 会替换成s=3.14;*r*r; 程序报错
#define int int* void main()
{ int p; #undef int a; return 0; }
上述代码 程序从上往下进行,在预编译时会将int 替换成int * #undef 终止宏的有效替换 所以p是个整型指针 a是个整型变量
#define MAX(x,y) ((x)>(y))?(x):(y) int Max(int a,int b) { return a>b? a:b; } int main() { int a = 10, b = 5; double x=12.23,y = 34.45; double c = Max(x,y); c = MAX(x,y); c = MAX(a,b); printf("%d ",a); return 0; }
程序在预编译的时候 看到c=MAX(x,y),将替换成 c=((12.23)>(34.45))?(12.23):(34.45); 即c=34.45;
区别于Max(a,b); 是函数调用
#define SUM(x,y) ((x * y)) int main() { int a = 3, b = 4; int c = SUM(a+5,b+6); // int c = (a+5*b+6); printf("%d \n",c); return 0; }
在预编译的时候替换成
int c = (a+5*b+6); 输出 29
#define begin { #define end } int main() begin int a = 10; printf("%d ",a); end
通过宏改变了c 语言的语法风格 用begin 于 end 替换了{ }
#include<stdio.h> #define MAX(x,y) ((x)>(y))?x:y int Max(int a,int b) { return a>b?a:b; } int main() { int a = 10, b = 5; //int c= Max(++a,b); // printf("%d\n",c); int x=MAX(++a,b); printf("%d \n",x); return 0; }
宏替换 int x=((++a)>(b))?++a:b: 先对a进行自加 变成11 然后比较 又对a进行自加变成12 赋给 x 所以输出x为12