c语言的查漏补缺(一.几个容易忘记的点)

〇.写在前面

若读者朋友们发现问题,请不吝斧正。

一.数据类型及字节大小

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;
}

左移

右移操作符: >>
右移操作符分为以下两种

  1. 逻辑移位 对应无符号数(unsigned)
    左边用0填充,右边丢弃
  2. 算术移位 对应有符号数(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](数组的第二个元素)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值