C语言笔记1

1. C语言整数除法,无论操作数是正还是负,都把小数部分截掉,在数轴上表现为向零的方向取整。


2.  %取余运算(取模运算)结果符合总是与被除数相同。(不同编程语言对取模运算的规则各不相同)。


3. 浮点型的精度度有限,不适合用==运算符做精确比较。且不同平台浮点数实现有许多不同之处。


4. 在编程语言中,用来表示逻辑真和假的类型称为布尔类型,C语言中没有专门的布尔类型,布尔类型通常用int类型表示,非0表示真,0表示假。(C99也定义了专门的布尔类型_Bool,但目前没有被广泛使用。)


5.  switch 语句的优点: 

     (1)代码清晰。

     (2)有时候编译器会对其进行整体优化,较等价if/else生成的指令效率更高。


6. 函数返回一个值相当于定义一个和返回值类型相同的临时变量并用return后面的表达式来初始化


7. 每次都有一点区别的重复工作称为迭代。


8. 递归能解决的问题用循环也能解决,但解决问题的思路不一样。用递归解决这个问题靠的是递推关系n!=n·(n-1)!,用循环解决这个问题则更像是把这个公式展开了:n!=n·(n-1)·(n-2)·…·3·2·1。

递归 : 函数式编程思想,描述要做什么。

循环 : 命令式编程思想,描述一步一步要做什么。


9. 多次对变量赋值时很危险的事。


10. 我们看一个有意思的问题:a+++++b这个表达式如何理解?应该理解成a++ ++ +b还是a++ + ++b,还是a + ++ ++b呢?应该按第一种方式理解。编译的过程分为词法解析和语法解析两个阶段,在词法解析阶段,编译器总是从前到后找最长的合法Token。把这个表达式从前到后解析,变量名a是一个Token,a后面有两个以上的+号,在C语言中一个+号是合法的Token(可以是加法运算符或正号),两个+号也是合法的Token(可以是自增运算符),根据最长匹配原则,编译器绝不会止步于一个+号,而一定会把两个+号当作一个Token。再往后解析仍然有两个以上的+号,所以又是一个++运算符。再往后解析只剩一个+号了,是加法运算符。再往后解析是变量名b。词法解析之后进入下一阶段语法解析,a是一个表达式,表达式++还是表达式,表达式再++还是表达式,表达式再+b还是表达式,语法上没有问题。最后编译器会做一些基本的语义分析,这时就有问题了,++运算符要求操作数能做左值,a能做左值所以a++没问题,但表达式a++的值只能做右值,不能再++了,所以最终编译器会报错。


11. goto语句的唯一限制就是只能跳转到同一个函数中的某个标号处。goto语句最主要的用途是做出错处理。


12. 五种后缀运算符:后缀++、后缀--、结构体取成员.、数组取下标[]、函数调用()。还学习了五种单目运算符(或者叫前缀运算符):前缀++、前缀--、正号+、负号-、逻辑非!。在C语言中后缀运算符的优先级最高,单目运算符的优先级仅次于后缀运算符,比其它运算符的优先级都高。


13. 数组做右值使用时自动转化为指针类型。


14. C语言的设计精神是:相信每个C程序员都是高手,不要阻止程序员去干他们需要干的事,高手们使用count[-1]这种技巧其实并不少见,不应该当作错误。


15. 调用C标准库函数rand()得到的随机数其实是伪随机(Pseudorandom)数,是用数学公式算出来的确定的数,只不过这些数看起来很随机,并且从统计意义上也很接近均匀分布(Uniform Distribution)的随机数。


16. 函数内的注释要尽可能少用。写注释主要是为了说明你的代码“能做什么”(比如函数接口定义),而不是为了说明“怎样做”,只要代码写得足够清晰,“怎样做”是一目了然的,如果你需要用注释才能解释清楚,那就表示你的代码可读性很差,除非是特别需要提醒注意的地方才使用函数内注释。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章