C专家编程--学习笔记(1)_为什么程序员分不清万圣节和圣诞节

以前大一的时候,相信cs系的兄弟姐妹们都学了c语言.但是,那是学的,毫无疑问,都是些最最最基础的.

现在,花点时间,学习一下<<c专家编程>>.以我看来,名字说是专家,其实内容更专家.^_^.

这里,把自己的学习笔记,总结,感想写出来.以供参考吧.也希望哪位能指出我的错误.必感谢之.

这里,先写一下第八章的总结.闲话少说.

第八章的标题是为什么程序员分不清万圣节和圣诞节,这个标题很怪直到第二次仔细阅读内容时,大概才明白.

我们都知道.在西方,万圣节是10月31号,圣诞节是12月25号.而10的八进制是12,25的八进制是31,所以........^_^.

其实,这只是一个引子.后面讲的,更多是在c程序中类型转换.仔细想想,这和上面的8,10进制之间的关系是不是一样的

呢?

先给一个惊人的#define,(作者这么形容的,^_^)

#define X  )*2+1

#define _ )*2

#define s ((((((((((((((((0  /*用于建立16位宽的图形*/

然后,可以用这些define了,

static unsigned short stopwatch[]={

          s  _ _ _ _ _ _X X X X X _ _ _ X X _,

          s  _ _ _ _  X X X X X X X  X X  _ X X _,

        .......................(略)

}

第一次看到这样的运用,一头雾水,还好,有csdn,发个帖后知道.上面的define,只所以要用括号,是要在下面用的时候

左右是要配对的.如果把上面的define老实地代到下面的运用中,应该就能明白了.这个运用的结果最终是产生一系

的16进制的数,为一个有16的象素图像各个点的颜色值.如果只是用数字定义,感觉不直观.如果换用define后,就能

在程序中就能明白要的是什么样的图形.好洋气哦.

然后,在书中讲到了在等待时类型发生了变化.因为讲的是K & R C和ANSI C的比较.加之,现在K & R C不用(???)

所以,只是说说一些大概的.^_^.只要在函数定义和说明的时候用想通的参数类型就ok了.我是这样理解的.

由于printf("%d",sizeof ' A ');的原因,我又温习了一下两个char之间的加法.这里也说说.

在char加的时候,是用的他们的ascii码做的,还有char是8位的,所以如果运行

char c1='a',c2='1',m;

m=c1+c2;

printf("%d",m)的话,输出会是-110,原因就不说了吧.这里只是复习.^_^.

另外,书中还有一节讲的是不需要按回车键就能得到一个字符.主要讲的是在unix下的东西,加之win下面都有函数了

这里,也略过.不过,里面有提到一个老板键的概念.还是新听说的,这里要记住哦.^_^.

另,在系统调用后(如ioctl)后,检查一下全局变量errno会是一个好的习惯,它隶属于ansi c.

在文中的第7节,讲到了用c实现有限自动机(FSM),因为刚好在学习编译原理,这部分内容还是挺及时的.^_^.

文中写到,在c中,有几种方法可以用来表达FSM,但他们绝大多数都是基于函数指针数组的.一个函数指针数组可以这

样声明:

void (*static[MAX_STATES])();

如果知道了函数名,就可以向下面这样对数组进行初始化.

extern int a(),b(),c(),d();

int (*static [])()={a,b,c,d};

可以通过数据中的指针来调用函数:

(*static[i])().所有的函数必须接受同样的参数,并返回同种类型的返回值(除非你把数组元素做为一个集合).

上面的这些,是和书中一样的.因为我觉得,这个说得(就我自己来说)太好了.

在文中,还提到增量开发(incremental development)和显示代码调试(debugging code into existence),具体讲的

是什么,查查其他的资料吧.

还有一个函数要说说.

int hash_filename(char *s)

{

      int length=strlen(s);

      return ( length + 4 * ( s [ 0] +4 *s [ length/2] ) )%ETLE_HASH;

}

从名字就能看出来,这个函数大概和hash表有关系.具体是什么,自己分析吧.^_^.

最后,第9节,讲了一下强制类型转换的方法.即为:

1.一个对象的声明,它的类型就是想要转换的结果类型.

2.删去标识符(以及任何如extern之类的存储限定符),并把剩余的内容让在一对括号里.

3.把第2步产生的内容放在需要进行类型转换的对象的左边.

并以qsort为例说明,qsort的定义在stdlib中,原型为

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

可以向qsort传递一个自己的比较函数,但是设计到强制类型转换.比如定义

int  intcompare ( const int * i, const int * j){

     return (*i - *j);

}

假设有一个10元素的数组a.qsort可以这样调用

qsort(a,10,sizeof(int),

          ( int (*)(const void * ,const void *))intcompare

);

就这么多了,还要看自己能不能融会贯通了.^_^

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值