宏定义 1.终止宏定义的作用域:#undef 标识符 2.带参宏定义:#define 宏名(参数表)字符串
#include<stdio.h>
#define A 2
#define B A+A
#define C (A+A)
#define D(a,b) a*b
#define E(a,b) (a)*(b)
int main(void){
printf("%d,%d,%d\n",A,B*B,C*C);
printf("%d\n",D(2,3));
printf("%d\n",D(2,2+1));
printf("%d\n",E(2,2+1));
return 0;
}
宏名之间重名的问题
#include<stdio.h>
#define A 2
void f(void){
printf("%d\n",A);
}
#define A(a,b) a-b
void g(void){
printf("%d\n",A(5,2));
}
int main(void){
f();
g();
return 0;
}
undef终止宏的作用域
#include<stdio.h>
#define A 2
#define B(a,b) a+b
void f(void){
printf("%d,%d\n",A,B(4,1));
}
#undef A
#undef B
int main(void){
f();
return 0;
}
#include<stdio.h>
#define A 2
#define B(a,b) a+b
void f(void);
#undef A
#undef B
int main(void){
f();
return 0;
}
void f(void){
}
宏名与函数名重名
#include<stdio.h>
void F(int a){
printf("%d",a);
}
#define F(a) F(a);printf("haha")
int main(void){
F(3);
return 0;
}
放在宏名F之后报错:
#include<stdio.h>
#define F(a) F(a);printf("haha")
void F(int a){
printf("%d",a);
}
int main(void){
F(3);
return 0;
}
函数的指针
定义指向函数的指针变量的一般形式为:类型名(*指针变里名)(函数参数表列)
#include<stdio.h>
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a>b?b:a;
}
int main(void){
int (*p)(int,int);
p = max;
printf("%d\n",(*p)(10,5));
p = min;
printf("%d\n",p(10,5));
return 0;
}
auto自动变量和register寄存器变量
#include<stdio.h>
int main(void){
auto int a=3;
for(int i=0;i<10000;++i)
;
register int j=2;
return 0;
}
extern的用法和静态外部变量
用法一:
#include<stdio.h>
extern int A;
int main(void){
printf("%d\n",A);
return 0;
}
int A = 10
用法二: 在1.cpp中
int A = 10;
static int B = 100;
int *p = &B;
在2.cpp中
#include<stdio.h>
extern int A;
extern int B;
extern int *p;
int main(void){
printf("%d\n",A);
printf("%d\n",*p);
return 0;
}
static int A = 14;
在3.cpp中
int A = 99;
static局部变量-静态局部变量
#include<stdio.h>
int *p;
void f(void){
int i=10;
static int j;
printf("%d,%d\n",i++,j++);
p=&j;
}
int main(void){
f();
f();
f();
printf("%d\n",*p);
return 0;
}
内部函数和外部函数 在1.cpp中
#include<stdio.h>
extern void f(void);
void g(void);
extern void (*p)(void);
int main(void){
f();
(*P)();
return 0;
}
static void f(void){
printf("1111\n");
}
在2.cpp中
#include<stdio.h>
static void g(void){
printf("g函数运行\n");
}
void (*p)(void)=g;
extern void f(void){
printf("haha\n");
}
在3.cpp中
#include<stdio.h>
变量的存储方式和生存期 1.变量的存在时间即生存期,在程序运行的整个过程中都存在的变量是在内存的静态存储区存放的;有的变量则是在调用其所在函数时才临时分配存储单元,调用结束后该存储单元被释放,这种变量是存放在内存的动态存储区的。
2.每一个变量和函数都有数据类型和数据的存储类型。 注:建立储存空间的声明是定义声明(如: int a;),不需要建立储存空间的声明是引用声明(如:extern int a;) undef,extern和函数声明注意的小知识点
#include<stdio.h>
#undef AB
#undef AB
extern int a;
extern int a;
void f(void);
void f(void);
int main(void){
return 0;
}
递归 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为递归调用。
递归求5的阶乘
#include<stdio.h>
int f(int a){
if(a==1||a==0)
return 1;
else if(a>1)
return a*f(a-1);
else
return -1;
}
int main(void){
printf("%d\n",f(5));
return 0;
}
递归求汉诺塔
#include<stdio.h>
void f(char a,char b){
printf("从%c柱上往%c柱上挪动一个圆盘\n",a,b);
}
void g(int i,char a,char b,char c){
if(i==2){
f(a,b);
f(a,c);
f(b,c);
}
else if(i>2){
g(i-1,a,c,b);
f(a,c);
g(i-1,b,a,c);
}
}
int main(void){
g(3,'A','B','C');
return 0;
}
|