目录
〇.写在前面
若读者朋友们发现问题,请不吝斧正。
一.数据类型及字节大小
char //字符数据类型 1字节
short //短整型 2字节
int //整形 4字节
long //长整型 4字节
long long //更长的整形 8字节
float //单精度浮点数 4字节
double //双精度浮点数 8字节
二.常量
C语言中的常量分为以下以下几种:
1.字面常量
2.#define 定义的标识符常量
3.枚举常量
4.const 修饰的常变量
int main()
{
//1.字面常量
3.14;
100;
'a';
"hello world";
//2.const修饰的常量
const int num = 10;
//num = 20; (报错,无法修改)
//3.define定义的常量
#define MAX = 1000
//4.枚举常量
enum Sex
{
MALE,
FEMALE
};
//枚举常量默认是从0开始,依次向下递增1的
printf("%d\n", MALE); // 0
printf("%d\n", FEMALE); // 1
return 0;
}
三.字符串和字符数组的区别
int main()
{
char* str1 = "abcde";
char str2[6] = { 'a','b','c','d','e','\0' };
char str3[6] = "abcde";
char str4[5] = "abcde";
char str5[5] = { 'a','b','c','d','e' };
return 0;
}
1.字符串(“abcde”)最后会有一个/0
2.字符数组({ ‘a’,‘b’,‘c’,‘d’,‘e’ })不会携带/0
3.注意:
char str3[6] = “abcde”;
char str4[5] = “abcde”;
二者居然都可以,区别在于str3多存了一个\0;
四.移位操作符,位操作符和逗号表达式
1.移位操作符
左右移位操作符都是操作的内存中的二进制数
左移操作符: <<
左边去掉,右边补0
int main()
{
int a = 1;
a << 1;
}
右移操作符: >>
右移操作符分为以下两种
- 逻辑移位 对应无符号数(unsigned)
左边用0填充,右边丢弃- 算术移位 对应有符号数(signed)
左边用原该值的符号位填充,右边丢弃
2.位操作符
位操作符只能对整数作用,直接操作内存中的二进制数
(1)按位与(&): 同为1得1,其他得0
(2)按位或(|): 同为0得0,其他得1
(3)按位抑或(^): 相同得0,不同得1
3.逗号表达式
逗号表达式从左到右依次执行,逗号表达式的结果为最后一个表达式的结果
int main()
{
int a, b, c, d;
a = 0;
b = 1;
//c的值为4
c = (b++,a=a+b,a+b);
//注意:没有括号不是逗号表达式,只是分开运算
a = 0;
b = 1;
//d的值为1
d = b++, a=a+b, a+b;
return 0;
}
五.隐式类型转换
1.整形提升
(1)当使用某些操作符(如+,-,*,/)时,如果被操作的数据类型的大小小于int(4个字节)时,会在使用之前被转换成整形大小。
(2)整形提升的规则:按符号位提升
2.算术转换
(1)如果某个操作符的各个操作数属于不同的类型,那么需要先将两个操作数转换为相同的类型,之后才能进行操作。
(2)算术转换先后顺序:
long double
double
float
unsigned long int
long int
unsigned int
int
下层的数据要转换为上层的数据之后才能进行操作。
(3)关于如何实现隐式类型转换的,c++的原理是运算符重载。
六.static关键字
1.static对局部变量作用
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int j = 0;
for (j = 0;j < 10;j++)
{
test();
}
return 0;
}
// 1 2 3 4 5 6 7 8 9
static对局部变量作用时,会改变它的生命周期,使它不会在函数结束后被销毁。
2.static对全局变量和函数作用
static对全局变量和函数作用时,会使它只能在本源文件中被使用,若在工程中其它的源文件中调用会报错。
七.const关键字
(1)const作用于变量时,会使它的权限降低,从可读可写变为可读。
(2)const作用指针时,放的位置不同,有不同的意义。
(3)当const作用的变量作为函数参数传参时,如果函数内部可能改变此变量,则会报错。此时必须把函数的形参也用const修饰。这里的本质问题是权限放大。
八.二维数组
int arr1[2][3] = { 1,2,3,4,5,6 };
int arr2[2][3] = { {1,2,3},{4,5,6} };
int arr3[][3] = { 1,2,3,4,5,6 };
int a = arr1[0][2];
(1)二维数组和一维数组一样,未初始化的部分默认为0
(2)二维数组可以省略行号,不能省略列号
(3)以arr1为例,arr1[0]和arr[1]可以看做一个一维数组,整个arr1就可以看做以一维数组为元素的数组,所以arr1+1的地址就是arr1[1](数组的第二个元素)