在分支语句中,else只会与最近的if匹配
对于编程风格,推荐《高质量c/c++编程》
switch语句:(得是整型表达式)
编程好习惯:在每一个switch语句中都放上一条default子句,并且在后面加上一个break。
举例:输入1,输出星期一。
#include <stdio.c>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)
{
case 1 :
printf("星期一\n");
break;
case 2 :
printf("星期二\n");
break;
default:
printf("请输入正确选项");
break;
}
return 0;
}
在while循环中,break用于永久中止循环;continue的作用是跳过本次循环continue后边的代码。
getchar:读取字符,当字符不正确错误时,将会输出EOF(结束指令)。
//在缓存区处理多个字符存在的情况。
int ch = 0;
while (ch = getchar() != '\n')
{
;
}
for循环语句使得“初始化、判断、调整”三个表达式放在一起,相比于while循环使得更加明了。
goto循环应在多层嵌套里使用,不建议随意使用goto循环语句,会破坏语言的逻辑性。
使用c语言库函数时,需要学会查询工具的使用:MSDN、“www.cplusplus.com”、“http://en.cppreference.com”。(涉及c语言的库函数使用介绍)
当函数返回类型是“void”时,表示这个函数不需要返回任何值、也不需要返回。一个自定义函数如果不写返回类型,则默认选择返回int类型。
递归:一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需要少量程序就可以描述多次重复计算的事情。(把大事化小)
递归的两个必要条件:1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。2.每次递归调用之后越来越接近这个限制条件。
关于程序员的“知乎”网址:“http://stackoverflow.com”
32位机的指针地址大小为4个字节,64位的指针地址大小为8个字节。
野指针的成因:未初始化指针;指针越界访问;指针指向空间被释放。 如果不知道指针应该初始化成什么地址时,应该初始化为null。
数组名:是数组首元素的地址。
例外:1.sizeof(数组名)——数组名表示整个数组——计算的是整个数组的大小,单位是字节。
2.&数组名——数组名则表示整个数组——取出的是整个数组的地址。
操作符详解:
单目操作符:!(逻辑反操作)、-(负值)、+(正值)、&(取地址)、sizeof(操作数的类型长度、以字节为单位)、~(对一个数的二进制按位取反)、--(前置、后置--)、++(前置、后置++)、*(间接访问操作符、解引用操作符)、“类型”(强制类型转换)。
隐式类型转换
整型提升:
C的整型算术运算总是至少以缺少整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
其意义在于表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器ALU的操作数的字节长度一般都是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内执行操作数的标准长度。通用CPU式难以直接实现两个8bit字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都先转换为int或unsighed int,然后才能送入CPU去执行运算。
算术转换:
操作数类型的层次:“long double——double——float——unsigned long int——long int——unsigned int——int”,如果两个操作数的类型不同,则由低的类型向上转换。
指针
指针类型的意义
- 指针类型决定了:指针解引用的权限有多大。
- 指针类型决定了,指针走一步,能走多远。
野指针的成因:
未初始化指针;指针越界访问;指针指向空间被释放。
如果不知道指针应该初始化成什么地址时,应该初始化为null。
避免野指针产生:指针初始化;小心指针越界;指向空间释放及时置null;检查指针有效性。
指针运算
指针关系运算标准规定:运行指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
※数组名就是数组首元素的地址。
结构体
结构体式一些值得集合,这些值可以不是同一类型的。
定义结构体用struct,访问一个结构的成员时,“结构体.成员名”、“结构体指针->成员名”
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能下降。所以结构体传参的时候,要传结构体的地址。
调试技巧
调试快捷键:
F5:启动调试,经常用来直接跳到下一个断点处。
F9:创建断点和取消断点的作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者式一条语句。
F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
断言函数:assert函数可以使发现哪里有逻辑错误。