计算长度:
“\0"表示字符串输出结束的标志,不计入字符串长度中,但是其必然会出现在字符数组的最后一个位置;
(strlen 计算字符串长度时,不包括”\0";但是 sizeof 计算 字节数 包含"\0")
单位转化:
bit(比特) —> byte(字节) —> kb —> mb —> gb
1byte == 8bit (比特位) (1个字节等于8个比特位)
1kb == 1024 byte (字节)
1mb == 1024kb
1gb == 1024mb
关键字:
1.const 修饰变量,使变量具有"常量"属性,但还是变量;
(C++ 中const修饰的变量,可以使其变成常量,比如
定义数组时,禁止数组大小中的括号使用变量,但是如果是const修饰的变量就可以,但是C语言就不行)
2.auto 局部变量 (一般默认);
(C++中的auto是另一个含义,这里有两篇文章关于 auto 的讲解
C++ auto 讲解 和 C语言 auto 和 C++ autod 的区别)
extern 外部变量 (声明外部变量)
3.register 寄存器 可以用来修饰变量,但是其修饰的变量不可以取地址;(建议词)
4.typedef 类型重命名
eg: typedef (原类型名) (新类型名)
(注意:如果看过STL源码的人,会发现,typedef 会经常和 typename 一起使用 C++ typename 总结)
5.char 修饰的对象的取值范围是 127 ~ -128
为何char 的取值范围是这个,就不详细解释了,这里有篇文章可以学习了解下:char 的取值范围
6.volatile 类型修饰符,保证内存的可见性,使得每次访问其修饰的变量都直接访问其变量的内存;预防编译器进行优化;
volatile 修饰一个变量,使该变量在内存中有一个拷贝,变成 register;
这里有篇文章可以了解下:volatile 介绍
7.static 修饰的变量放在静态存储区,不会因为当前函数结束就被销毁,只会初始化一次;
static 修饰的函数或者变量只能在本文件中被访问;
static 定义的变量或者函数只会被初始化一次,多次调用该变量或者函数,该变量都不会被再次初始化赋值;
static 修饰的变量:
全局变量:为了改变作用范围,使具有外部链接属性的变量,变成内部链接属性,变成本源文件私有产物;
局部变量:为了改变变量的存储类型,保留变量的内容;
这里有一篇文章关于static的详细介绍,可以了解下 C语言static分析
二进制运算符:
1.异或 ^ :同为0异为1 ,可以用来实现加密效果
注意:如果一个数和自己异或,那么得到值为0;
如果一个数和0异或,那么得到的值还是自己;
A ^ B = C 那么, C ^ B = A, 或者 C ^ A = B;
举个例子:
int n = 3 ------> 二进制 011
int m = 5 ------> 二进制 101
c = m ^ n ------> 二进制 101 ^ 011 ====> 110,
m = c ^ n ------> 二进制 110 ^ 011 ====> 101,所以现在的 m = 5
n = c ^ m ------> 二进制 110 ^ 101 ====> 011,所以现在的 n = 3
2.与 & :二进制中相当于位的乘法(按位与)
注意:如果要计算一个数的二进制中有多少个1,可以使用 N&(N-1),可以消除掉当前N的最右边的1
//eg:将一个数转化成二进制,输出这个数二进制中1的个数
int n = -1;
int num = 0;
while (n != 0)
{
++num;
n = n & (n-1);
}
printf(" 1 num --> %d", num);
//这里 -1 的二进制中有32个1
3.>> 二进制右移 << 二进制左移
比如: 5 >> 1 = 2 5的简略二进制数值101,右移一位二进制是10 值为2
(可以用来求平均数,比如 10 向右移动1位,结果是5)
比如: 5 << 1 = 10 5的简略二进制数值101,左移一位二进制是1010 值为10
4.计算机中将变量存入内存中是以 补码 的形式存储的。
正数:原码 = 反码 = 补码
负数:补码 = 原码取反加1,符号位不变
提高循环效率
1.如果在多层嵌套的循环中(比如for),建议循环次数最多的放在里面,循环次数少的放在外层;
2.如果在循环过程中,并且循环的次数非常大(比如,> 10000),并且循环内部存在条件判断语句时,尽可能的将判断条件放在循环的外层;
求平均值
一般求平均数计算方式:
int half = (left+ right) / 2
但是如果在两个数非常大的情况下,left+ right 就可能出现溢出的情况,那么就需要优化我们求平均数的计算方式:
1.int half = left- ((left- right) >> 1)
2.int half = left- ((left- right) / 1)
3.int half = (left & right) + ( (left ^ right) >> 1)
*数字 << ==== >> 字符 转换*
字符 - ‘0’ == 数字
数字 + ‘0’ == 字符
char t = 'a';
int test1 = t - '0'; // test1 == 49
int t2 = 50;
char test2 = t2 + '0'; // test2 == b