1. printf函数
其实 printf()函数是有返回值的(只是平常不需要关心它的返回值)表示实际打印的字符数;同理,scanf函数也有返回值,表示实际输入的字符数
2. glibc
- glibc是linux平台上使用最广泛的C函数库,几乎所有C程序都要调用此库。
- glibc提供一组头文件和一组库文件。包括最基础的libc.so库,和数学计算libm.so库,以及多线程C程序依赖的libpthread.so库 等。。。
- glibc并不是linux平台唯一的C函数库,有别的C函数库 如:uClibc.
详见:uClibc_baidu and uClibc
3. 高亮问题!
- 用vim阅读文档时,光标停于某字符处(比如停于X处),这时按 ‘Shift+8’ 可以将文档中所有 X 都高亮显示。
- 取消:按下 Esc 确保处于非编辑模式。输入 / < X > ,即可恢复原状!
- 解释:当显示高亮的时候,再次按下 ‘Shift+8’ ,则在 Terminal 底端会出现 '/ < X > ' 由此蒙出以上2 的解决办法。或者为 < X >
4. 局部变量和全局变量
局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(Constant Expression)初始化。
例如:全局变量 pi 这样初始化是合法的
double pi = 3.14 + 0.0016;
但这样初始化是不合法的:
double pi = acos(-1.0);
acos(double)为反余弦函数,C语言中,反三角函数arccos简称为acos,同理,反正弦为:asin(double);反正切为:atan(double)或者,atan(double1,double2) = atan(double1/double2).详情点击
然而局部变量这样初始化却是可以的。
5. 运算符
** % ** 取模运算符
X % 2 表示 X 除以 2 所得的余数。C语言规定%运算符的两个操作数必须是整型的
当用printf()函数输出 ‘%’ 符号的时候,需要定义如下:printf("%% %d",a);【假定 a = 2】
输出即为:% 2
6. 传参
- C语言的传参规则为:Call by Value,按值传递。return也是按值传递。传回的只是数据,而不是参数本身,因为参数马上就要被释放掉了。
return() 可以返回一个表达式!例如:
1 #include < stdio.h >
2 #include < math.h >
3 int main()
4 {
5 int x,c;
6 printf("please input x:");
7 scanf(" %d ",&x);
8 c = fabs(x); //求绝对值函数
9 return (printf("|x| = %d\n",c));
10 }
运行结果为:
please input x:-4
|x| = 4
7. 增量式开发 、 封装 与 分层设计
- 其实就是先搭框架,再慢慢添加东西!美其名曰:增量式开发
- 封装主要是为了避免重复代码的出现,降低可能出现的维护工作量。把解决各种小问题的代码封装成函数,在解决第一个大问题时可以用这些函数,在解决第二个大问题时可以复用这些函数。
- 解决问题的过程是把大的问题分成小的问题,小的问题再分成更小的问题,这个过程在代码中的体现就是函数的分层设计(Stratify)
8. 神之递归
如果你相信你正在写的递归函数是正确的,并调用它,然后在此基础上写完这个递归函数,那么它就会是正确的,从而值得你相信它正确。玄乎其玄!数学证明如下:
从数学上严格证明一下 factorial 函数的正确性。刚才说了, factorial(n) 的正确性依赖于 factorial(n-1) 的正确性,只要后者正确,在后者的结果上乘个 n 返回这一步显然也没有疑问,那么我们的函数实现就是正确的。
因此要证明 factorial(n) 的正确性就是要证明factorial(n-1) 的正确性,同理,要证明 factorial(n-1) 的正确性就是要证明 factorial(n-2) 的正确性
依此类推下去,最后是:要证明 factorial(1) 的正确性就是要证明 factorial(0) 的正确性。而 factorial(0) 的正确性不依赖于别的函数调用,它就是程序中的一个小的分支 return 1; 这个1是我们根据阶乘的定义写的,肯定是正确的
因此 factorial(1) 的实现是正确的,因此 factorial(2) 也正确,依此类推,最后factorial(n) 也是正确的.
8.for循环
循环中可以这样定义i:
for (int i = 1;;)
如果这样定义,那么变量 i 只是 for 循环中的局部变量而不是整个函数的局部变量,循环外就不能继续使用i;
这个程序用 gcc 编译要加上选项 -std=c99 。
9.break和continue语句
break 语句可以用来跳出 switch 语句块,这个语句也可以用来跳出循环体。
continue 语句也会终止当前循环,和 break 语句不同的是, continue 语句终止当前循环后又回到循环体的开头准备执行下一次循环。