编程习惯
- 每写一段程序就测试程序是否正确。总之就是写一段验证一段
- 做除法运算时,一定要检测分母为零的情况
- 尽量多使用小于符号 便于程序理解和程序的规范(比如二分查找)
编程技巧
-
如果数字大的离谱,说明有技巧或者规律
-
循环时使用位运算可以大大提高速度
-
除法用辗转相除法
-
指针:
p+i
a+i
&a[i]
等价(p+i)
(a+i)
a[i]
等价p[i]
(p+i)
等价a[i] [j]
,* (*(p+i)+j)
等价于p [i] [j]
-
char *p p="hello"
(当赋值后,值不能再被修改。但是可以对p
重新赋值) -
&a
相当于管辖范围上升了一级*a
相当于管辖范围下降了一级 -
int sum(int a[])
将形参数组名作为指针变量来处理 -
const int *p
当p
被赋值后p
所指向的值不能再被修改,但是p
可以被重新赋值 -
int *function(int sum)
返回指针的函数。必须确保返回的地址有意义,返回全局变量的地址,不是非全局变量,返回静态局部变量,而非动态 -
C语言中每一个函数都有地址
-
算数组个数:
sizeof(a)/sizeof(a[0])
-
定义结构体的时候,里面的变量可以不能初始化。因为定义结构体时,并未给其分配内存,所以初值是无法存储的
-
打表,就是把各个情况的答案列举出来,然后对应输出来
-
注意:前序遍历的结果使用堆栈改变根节点和左子树的输出顺序后,前序遍历的结果成了中序遍历。因为堆栈交换了根节点和左子树的输出顺序,当然也能交换左右子树的输出顺序等其他树输出的顺序
-
C/C++库中,
qsort
比较函数的返回值是int
而sort
是返回bool
-
由于结构体内存在
next
指针,而申请结构体空间后同时定义了next
指针,此时next
指针未指向任何空间,在测试时可能导致错误 -
参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找
-
C语言中正无穷大,头函数:
#include <limits.h>
,无穷大INT_MAX
,无穷小INT_MIN
文献参考 -
当用多重循环枚举答案时,定义一个标志并且设置为循环条件。一旦找到循环条件不成立就退出所有循环
-
求素数:筛法(最快)
-
三目运算符:
c=a>b?a:b
字符串
%c
会读取任何字符,包括换行和回车。其他格式输入,如果空格出现在前面,会被摒弃掉- 字符前面有回车,一定要先用
getchar()
把回车吸收掉 - 尽量不要使用
getchar()
- 字符串的处理一定要注意:完了之后要在最后一个元素手动加一个
‘\0’
- 对于字符数组而言,数组名可以直接打印出数组里面的全部字符。如果指针不是值得首元素,那么将打印指针所指向的字符以及后面全部的字符
int atoi(char* s)
字符串转换成整型数- strcmp比较字符串时与最后的
‘\0’
无关 - 使用strlen计算字符串长度时,
‘\0’
它不算进去
来源:CSDN
作者:兔子翻书
链接:https://blog.csdn.net/xingkongyj2/article/details/103647017