关于define
1.简单的define定义
#define 1000 MAX
一个简单的max就定义好了,它代表1000,如果在程序里面写
for(i=0;i{
................
}
编译器在处理这个代码之前会对MAX进行处理替换为1000。
2.define的“函数定义”
define可以像函数那样接受一些参数,如下
#define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c*a + b*d
另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。
3.宏的单行定义
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
(这里参考了 hustli的文章)
4.define的多行定义
define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)
#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
} while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个"/"
关于main(int argc,char* argv[])
main(int argc,char **argv)
argv为指针的指针
argc为整数
char **argv or: char *argv[ ] or: char argv[ ][ ]
main()括号内是固定的写法。
下面给出一个例子来理解这两个参数的用法:
假设程序的名称为prog,
1.当只输入prog,则由操作系统传来的参数为:
argc=1,表示只有一程序名称。
argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog
2.当输入prog para_1,有一个参数,则由操作系统传来的参数为:
argc=2,表示除了程序名外还有一个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
3.当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:
argc=3,表示除了程序名外还有2个参数。
argv[0]指向输入的程序路径及名称。
argv[1]指向参数para_1字符串。
argv[2]指向参数para_2字符串。
void main(int argc, char* argv[ ])
char* argv[]:argv是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针,他的第一个元素即argv[0]为编译生成的可执行文件名(包括路径eg:"F:/VC/Ex1/Debug/Ex1.exe"),从二个元素(argv[1])开始,是每一个参数。
int argc:表示argv的大小,是实际参数个数+1,其中+1是因为argv[0]是编译后的可执行文件名
应该提醒的是: 传送main()函数的命令行参数的最大长度为128 个字符(包括参数间的空格),这是由DOS 限制的。
关于fflush(stdout);
flush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
fflush(stdout)刷新stdout,因为printf是缓冲输出,一般情况下stdout是行缓冲。
尝试代码:
fflush(stdout)当然是清空stdout的缓冲区了 你可以试试下面的代码 int i; for (i=0;i<10;i++) { printf("%d",i); // fflush(stdout); sleep(1); } 再去掉注释试试就知道了 |
for (i=0;i<10;i++){
printf("%d",i);
// fflush(stdout);
sleep(1);
}
注释掉时,屏幕上每秒打印一个数字(0~9);
使用fflush函数时,光标闪烁十秒,之后数字0~9一起被打印出来。
但使用“/n”时就不会出现这种情况。因为上例中缓冲区中没有换行符,所以全部数字被缓冲,之后打印。