C 拾遗

关于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);
}

再去掉注释试试就知道了
int i;
for (i=0;i<10;i++){
  printf("%d",i);
  // fflush(stdout);
  sleep(1);
}
注释掉时,屏幕上每秒打印一个数字(0~9);

使用fflush函数时,光标闪烁十秒,之后数字0~9一起被打印出来。

但使用“/n”时就不会出现这种情况。因为上例中缓冲区中没有换行符,所以全部数字被缓冲,之后打印。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值