C语言重点散知识整理(一)

计算长度:
“\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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值