作业反思
作业错误:数组的创建只能用常量定义初始长度,不能用变量,下为错误案例:
int n=10;
int arr[n]={0};
小任务:封装一个求最大值的Max函数,并且使用该函数判断输出最大值,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int num1 = 30;
int num2 = 20;
int max = 0;
max = Max(num1,num2);
printf("%d\n",max);
}
优化思路:作为判断的数值可以使用scanf的方式输入以替代固定数值。相较于判断两个数值,用数组存放多个数值,再用for循环遍历整个数组两两比较,最终判断整个数组的最大值,可以进一步优化代码的功能。
操作符(补)
~:按二进制位取反,例如对:1010进行按位取反,结果为0101
计算时可能涉及涉及原码,反码,和补码的概念,原码符号位不变,其他位按位取反得到反码,反码加1得到补码。若想由补码反向推出原码,则操作也要反向。注意:负数在内存中存储的时候,存储的是二进制的补码。 若一个整型是有符号的整型,那么它的二进制最高位表示符号位,最高位为0则该整型为正,最高位为1则该整型为负。
++:分为前置++和后置++;先来说后置++,顾名思义如:b=a++; 先使用a对b进行赋值,再a自增1;前置++如:b=++a; 先a进行自增1,再把自增之后的a赋值给b,需要留心甄别。
--:用法和++一样。
(类型):强制类型转换,例如:(int)3.14可以将3.14由浮点数型强制转换成整型
&&:逻辑与,表示并且的意思。两边都为真,结果才为真,其余情况都为假。所谓真假,非0即为真(默认的真是1),0即为假
||:逻辑或,左右两边只要有一个为真,则结果为真,若左右两边都为假则结果为假。
exp1?exp2:exp3 :即条件操作符也叫三目操作符。判断exp1是否为真,若为真则执行exp2,反之执行exp3.
计算机存储数据
寄存器:访问速度比高速缓存更快,空间比高速缓存更小
高速缓冲:访问速度快于内存,空间大小小于内存
内存:访问速度高于硬盘,空间小于硬盘
硬盘:访问速度较慢,存储空间较大
常见关键字
auto(自动),break(在循环中用于跳出循环中断),case,char,const,continue,default,do,double,else,enum(枚举),extern(引入外部符号),float,for,goto,if,int,long,register(寄存器关键字),return,short,sizeof,struct(结构体关键字),static,union,switch,typedef(类型定义),unsigned,void,volatile,while
知识点小插曲:static定义的静态变量的属性观察:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test()
{
static int a=1;//a定义为静态的局部变量
a++;
printf("%d\n",a);
}
int main()
{
int i =0;
while(i<5)
{
test();
i++;
}
}
打印出的效果如下:
此时静态的局部变量a和一般的局部变量不同,每次test函数结束后a的值并没有删除重置,而是保留下来执行后续的操作。即static修饰局部变量时,局部变量的生命周期变长了。
static也可以修饰全局变量,此时static改变了变量的作用域,这样该变量只能在它定义的源文件中使用,此时其他文件不可用extern进行外部引用该变量。
我们在定义函数的时候也可以跨文件定义,在一个文件中定义函数,在另一个文件中使用extern引入该函数,随后就可以正常的调用了。但是函数一旦用static修饰,该函数的链接属性就被改变了。
#define定义常量和宏
可以用 #define 定义一个标识符来表示一个常量
指针(重难点)
如何产生地址:32位/64位,这里指的是32根或64根地址线,对应的产生232个和264个地址。最终一个地址对应的空间大小是1个字节(byte)。取地址操作符&,打印地址printf("%p",&a);存地址int* p=&a;
小结论:指针大小在32位平台上是4个字节(byte),在64位平台上是8个字节。