一、变量
1,各种数据类型:
字符/字符串: char 1字节
整型(整数): short 2字节 int 4字节 long 4字节 long long 8字节
浮点型(小数): float 4字节,保证6位有效数字正确 double 8字节,保证15位有效数字正确
(编译器不同,数值可能会稍有不同)
但总的满足:short <= int <= long <= long long
另外,指针变量,32位系统为4字节,64位为8字节。
2,各类型数值范围计算方法:
例如,int型,4字节,而1字节(byte)等于8比特位(bit),故一个int位32位,而第一位为符号位(0代表正,1代表负),而正数负数之间还有一个0,故一个int数值范围为 -2^31到2^31-1。
(若超出范围,数据会溢出,造成截断,具体为:先转二进制补码,再直接截断超出部分,再转回原码。这种情况多见于,将 int 类型数值赋值给 short 等类型)
3,字面常量:
包括整型常量(1,2,3...)、字符型常量('H'、'e'...)、字符串常量("点赞"、"收藏"..)。
4,const和define:
const叫作常变量,本质是变量,define为标识符常量,仅仅是一个标志,也称宏定义。
5,全局变量和局部变量:
全局变量,在main函数外面前面定义变量即可,*生命周期是整个程序。定义后,可以在同一工程下用extern来调用变量。
局部变量,在函数内部定义的变量(包括main函数),*生命周期是所在函数。
若一个变量名既被定义全局又定义局部,则以局部为准。
(*生命周期:变量创建和销毁时间段)
6,static:
静态变量,当内有static定义的变量调用多次,则每次static定义的变量值在前一次调用基础上进行数值改变。修饰全局变量,但只能在源文件内使用,即使同一个工程不同源文件也不能使用。
7,typedef:类型重命名,例如:
typrdef longlong ll
下面即可用 ll 代替 longlong 。
8,无符号类型
例如,unsigned int,也可用 size_t 表示,为无符号整型,均为非负数,对应使用%u,数值范围为 0到 2^31-1,若强行给一个负数,则会转成二进制补码,然后表示,如 -1,最终就为全1转回十进制,为 2^32-1 。
9,类型转换
对于变量,例如,float x=3.51,可以利用 (int)x,来临时强制转换,结果为3,可见该法直接截断,并不四舍五入,另外这并不改变 x 的值,x仍然为3.51;
对于常量,例如,3.1415926535,可以采用 3.1415926535f,即可变成 3.141593 ,可见该法四舍五入。
二、运算
1,除号(/):
相除结果为负,则相除结果向下取整;若为正,则结果向上取整。总之,向靠近0的方向取整。
2,位操作符
<<左移 将数字转二进制补码,再左移,最右位补0,再转回原码。
>>右移 将数字转二进制补码,再右移,算术右移最左^符号位(正数为0,负数为1,无符号为0),逻辑右移补0,再转原码。(具体是哪种右移,可自行检验)。
&按位与,补码,同1为1,有0则0。
| 按位或,补码,有1为1,全0则0。
^ 按位异或,补码,不同为1,相同为0。
~按位取反,补码,每一位取反,包括符号位。
基操:
a=a | (1<<4) 补码第五位变1,a=a&~(1<<4)补码第五位变0。
a=a^b;b=a^b;a=a^b;实现ab无需再设变量交换。
3,逗号表达式
(表达式1,表达式2,... ...,表达式n),执行表达式 1 到 n ,并返回表达式 n 的值。
4,字符串
#include <string.h>
strlen(arr) 求字符串长度(不包括\0); memset(arr,'x',5)将arr前五个变'x' 。
strcmp(arr1,arr2)比较字符串,字典比较,ASCII码值各位依次比较,如"dianzhan"<"shoucang",就是由于'd'的ASCII小于‘s’的。> 输出正数(1), < 输出负数(-1),= 则输出 0 。
strcpy(arr1,arr2) 把 arr2 复制给 arr1 ,返回arr1地址。
5,算术转换
例如, int 型加 float 型,则自动将 int 型转化为 float 型进行运算 。
6,整型提升
char,short 类型,参与运算( + - * / ! )就会整型提升,char +x、char !x 大小均为 4 字节 。
7,sizeof
sizeof(a) ,a可以是整型数组也可以是字符串,若为int a[3]={1,2,3},则该结果为 4*3 ;
可以利用 sizeof(a)/sizeof(a[0]) 来计算数组长度,可以包括'\0' ;
sizeof 应该用 %u 形式输出。
sizeof内进行的运算并不生效,但会影响大小判断。
8,break,continue
break跳出整个循环,嵌套循环只会跳出所在的那个循环,不会执行for中常用i++;
continue跳出一次循环,会执行for中常用i++。
9,switch
常用于打印菜单,与case、break搭配使用,只能用于整型(字符,传递的是ASCII)。
10,关于\
\可以用来转义,例如输出双引号时可以在双引号前面加\即可;\ddd一个d代表一个八进制数;\xdd一个d代表一个十六进制数。
三、指针
1,内存存储,例如0x 1001 1001,除0x外,其他每一位均是一个十六进制,1位0001,0为0000,其中两个数字为1字节。
2,指针类型,取决于指向类型,不仅仅决定了解引用权限大小(可在int中一个字节一个字节取),更决定了走一步走多远(arr1+1,int型则为字节加4)。
3,定义后应该赋初值,可用空指针NULL,还要避免野指针,不能越界。
4,const在指针中
const int *p *p值可以变,但不能指向其他地址
int *const p *p值不可以变,但能指向别的地址
int const *const p 值和地址均不能变
四、基本知识
1,相关企业招聘需要掌握以下内容:计算机语言(C/C++/Java)、数据结构和算法、操作系统、计算机网络+网络编程、数据库、脚本语言
2,1TB=2^10GB 1GB=2^10MB 1MB=2^10KB(byte字节) 1KB=8kb(bit比特位)
3,数组元素不用'\0'作为结束标识符,若有算元素个数,字符串以'\0'作为结束标志,其长度不算'\0'
4,栈区:局部变量,函数的参数 ; 堆区:动态内存分配 ; 静态区:全局变量,static修饰的静态变量 ;
每次定义调用一个函数就要开辟一片栈区,而实参进形参则要在因该函数开辟的栈区中用部分栈区;变量从搞地址开始用,数组存放则是随着标号从低地址到高地址。
5,结构化程序设计语言:顺序结构,选择结构,循环结构。
6,结构体
创建:struct stu {int a;char b}; 使用:struct stu shhh={123,'h'} 调用:shhhh.a 、 shhh.b
7,两版本
Debug(调试)版本,可以更好的调试;Release(发布)版本,优化Debug的一些算法,生成的exe文件可以在其他电脑直接运行,且比Debug版本的更小,但Release版本不便调试。
8,计算数组长度:遍历,递归,两指针相减
9,缓冲区:键盘输入值时,并未将这些值存储,而是在键盘中,在回车之后会存储到缓冲区,其中'\n'也会占用缓冲区,常用 getchar() 来读走 '\n'
10,一些命令
cmd:
shutdown -s -t 60 60s关机 shutdown -a 取消关机
start cmd %0 弹出一次 cmd 窗口
<windows.h> : Sleep(1000)延迟1000ms system("cls")清屏
10,goto
少用慎用,可用于跳出多重循环,但只能在一个函数内跳(包括main函数)。
11,静态库
导入静态库,将lib文件拖至工程下(与.c文件同一个文件夹),在.c的代码开头,#pragma comment(lib,“... ... .lib")。
12,随机数
利用时间戳,#include <time.h>
srand((unsigned int)time(NULL)) 要a~b的随机数,rand()%(b-a+1)+a
13,assert
#include <assert.h>
断言,当可以条件符合时,无任何问题,但不符合时,则会报错,且在命令行窗口指出错误行数列数,极大方便调试。