使用malloc函数继续动态地址申请 需要添加头文件stdlib.h
int *arr;
int n=0;
arr = (int*)malloc(n * (sizeof(int)));//申请一个n长度的内存地址
其中第一个int*是由于申请的数组是arr是int类型的数组
malloc()的括号里面是字节数量,因此n个元素的数组就是n*每个元素的字节数量(sizeof(int))
清零要使用到memset函数 需要添加头文件memory.h
memset(arr, 0,4*n);//清空数组 按照字节清空
4*n等同于上一段讲的 n*(sizeof(int)) 等同于字节数
free()函数 头文件stdlib.c
free(arr);//释放内存
括号内是数组首元素地址/数组名/指针变量名
dir查找 cls清屏幕...调用system(“”)执行。引用头文件windows.h
system("cls");//清理exe的屏幕
do
{
continue;
}while(判断条件)//continue直接来到while条件判断位置处
scanf的返回值是所得到的该类型的元素个数,可以用来检测所输入的数值是否合乎要求
在一些需要输入的地方需要再输入后清空缓冲区,不然就会出现bug
printf的返回值是其实际控制输出的字符数
printtf("aa%d%c\n",a,b);//aa算两个 %d %c各算一个,\n算一个
printf("%d\n",printf("%d\n",printf("%d\n",43)))
1.要有结束条件
2.要越来越接近这个条件
3.递归在思想上是最后一次开始往回执行所需要的操作
4.递归位置前是判断和所需要的条件,递归位置后是要接收返回值的位置
递归会一直在栈区申请空间,如果递归很多次容易造成栈区溢出
将形参存在数组种,修改数组的内容,可以通过数组将修改结果带出
形参如果使用指针,最终指向外部的实参,在函数中对指向内容进行修改,改变的就是外部的实参。
全局变量不受函数的结束而结束,在函数中改变全局变量,主函数可以看到改变以后的结果。(最好少用全局变量)
函数的设计应该追求高内聚低耦合:函数体内部修改,尽量不要对外部产生影响,否则不方便维护影响稳定性。
参数谁申请的就谁维护谁释放,外部使用者可能不知道或者会忘记,容易造成资源泄露。
(a,b)先算a,再算b,最后整个逗号表达式的值是b的值
scanf(" _%c")%c前面加上空格可以消掉前面所有的空白字符(指空格符、制表符、回车符),加上getchar清除掉后面的字符
1.
while(~scanf(" %c",&ch))//%c前面加上空格吸收空白符
{
//代码段
while((ch=getchar())!='/n')
{
;//清空缓冲区
}
}
2.
while(scanf(" %c",&ch)!=EOF)//%c前面加上空格吸收空白符
{
//代码段
while((ch=getchar())!='/n')
{
;//清空缓冲区
}
}
C的整型算术运算总是至少以缺省整型类型(缺省:缺少省略时候的默认值)的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义: 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。
1.正数的整型提升 全部补0(高位符号位)
2.负数的整型提升 全部补1(高位符号位)
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)//整型提升以后a为0xffffffb6(补码)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
int main()
{
char a = 5;
//截断
//00000000000000000000000000000101
//00000101
char b = 126;
//00000000000000000000000001111110
//01111110
//00000000000000000000000000000101 - a
//00000000000000000000000001111110 - b
//00000000000000000000000010000011
//10000011 - c
//当a和b相加的时候,a和b都是char类型
//表达式计算的是就要发生整形提升
char c = a + b;
//10000011 - c
//11111111111111111111111110000011 - 补码
//11111111111111111111111110000010
//10000000000000000000000001111101 -> -125
printf("%d\n", c);//?
return 0;
}
long double (高)
double ^
float |
unsigned long int |
long int |
unsigned int |
int (低)
如果某个操作数的类型在这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运 算。(一般计算浮点数有一个浮点数类型结果就为浮点数的情况是一样的,但是接受结果的参数如果不是浮点型,会导致精度丢失)
float f = 3.14;
int num = f;//隐式转换,会有精度丢失
复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。
如果两者的优先级相同,取决于他们的结合性。
*一些表达式看起来没问题,但是不同编译环境下结果不一样,这种属于问题代码,要加以抵制,尽量保证写出来的代码机器能读懂,不同环境不会受影响,稳定输出结果。