梦开始的地方——c语言中那些细节(代码片段)

爱敲代码的三毛 爱敲代码的三毛     2022-12-11     694

关键词:

文章目录


static关键字

1.static修饰局部变量

  • 生命周期延长:该变量不随函数结束而结束,变成了全局变量的生命周期
  • 初始化:只在第一次调用该函数时进行初始化(函数中局部变量)
  • 记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
  • 存储位置:不会存储在栈上,放在数据段
  • 修饰变量时,没有被初始化时会被自动初始化为0

来看下面这段代码

#include <stdio.h>

void prt()

	static int a = 0;
	a++;
	printf("%d ", a);

int main()

	int i = 0;
	for (i = 0; i < 10; i++)
	
		prt();
	

	return 0;

输出

1 2 3 4 5 6 7 8 9 10

2. static修饰全局变量

静态全局变量,改变了全局变量的链接属性,使它的外部链接属性变成了内部链接属性只能在当前源文件内使用

3. static修饰函数

静态函数,同样也消除了它的外部链接属性,只能在当前源文件使用

函数的默认返回值

函数在不写放回值的时候默认返回的是整形,返回随机值

#include <stdio.h>

prt()

	

int main()

	printf("%d", prt());

	return 0;

隐式类型转换

1.整形提升

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
注意:整形提升是以符号位来进行提升的

来看一段代码

#include <stdio.h>
int main()

	char a = 3;
	char b = 127;

	char tmp = a + b;
	printf("%d\\n", tmp);
	
	return 0;

//输出
-126
  • 数字3的原反补码:00000000000000000000000000000011

  • 把3放到一个字节的char类型中就会发送截断,变成:00000011

  • 数字127的原反补码:00000000000000000000000001111111

  • 把数字127放到一个字节的char类型中也会发送截断,变成:01111111

  • 当字符a和字符b进行相加的时候,就会发送整形提升。会把char类型提升成4个字节的整形再相加,在左边添加上符号位0进行整形提升

  • 00000000000000000000000000000011 整形提升后a的补码

  • 00000000000000000000000001111111 整形提升后b的补码

  • 00000000000000000000000010000010 相加和

  • 因为1个字节是8个比特位,存放到tmp里就会发送截断,这个时候tmp里装的就是:10000010,最前面的1是符号位

  • 而在pritf(“%d”),以整形的方式来打印的时候又会发生整形提升。(而整形提升是以符号位来进行提升的)

  • 10000010 发生整形提升

  • 11111111111111111111111110000010(注意这是存在内存中的补码)

  • 11111111111111111111111110000001 减一得到反码

  • 10000000000000000000000001111110除符号位外取反得到原码

  • 最后打印的就是有符号的 10000000000000000000000001111110,也就是 -126

代码示例2

#include <stdio.h>
int main()

	char a = 0xB6;//1011 0110 使用时发送整形提升
	//00000000 00000000 00000000 10110110
	
	short b = 0xb600;
	int c = 0xb6000000;
	printf("%d", (int)a);
	if (a == 0xb6)
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("c");
	return 0;

//输出c
  • a发送整形提升后截断
  • 00000000 00000000 00000000 10110110
  • 10110110转换为十进制就是-74
  • b发生整形提升后截断变成10110110 00000000,变成了-18944
  • 它们的第一位都是符号位

代码示例3

#include <stdio.h>
int main()

	char a = 1;
	printf("%d\\n", sizeof(a));
	printf("%d\\n", sizeof(+a));
	printf("%d\\n", sizeof(-a));

	return 0;

//输出
1
4
4
//发生了整形提升

只要一个数参与了运算这个数不满足整形大小,就会发送整形提升,并且时以符号位进行提升的。

2. 整型提升的意义

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算

3. 算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类
型,否则操作就无法进行。下面的层次体系称为寻常算术转换

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算

比如 int 和 float进行运算,会先将 int 转换为flaot类型,int 和 long int 进行运算会将 int 先转换为 long int

int是最低的


梦开始的地方——c语言柔性数组(代码片段)

文章目录柔性数组什么是柔性数组?柔性数组的使用柔性数组的优点柔性数组什么是柔性数组?在C99中,结构体最后一个元素它允许是一个未知大小的数组,这就叫做柔性数组成员。这个概念听起来可能有点不可... 查看详情

梦开始的地方——c语言预处理+编译过程(代码片段)

文章目录C语言程序的编译(预处理)1.编译和链接1)编译的几个阶段预编译阶段编译阶段汇编阶段2)链接2.预处理1)预定义符号2)#define3)#和##4)带副作用的宏参数5)宏和函数对比3.常见预处理命令1)#undef2)命令行定义3)条件编译4)文件包含5... 查看详情

梦开始的地方——c语言文件操作详解(代码片段)

文章目录C语言文件操作1.什么是文件?2.文件指针3.文件的打开和关闭4.文件的顺序读写fgetc&fputcfgets&fputsfread&fwritefscanf&fprintfscanf/fscanf/sscanf对比printf/fprintf/sprintf5.文件的随机读写(fseek&ftell&rewind)6.文件结 查看详情

梦开始的地方——c语言数据在内存中的存储(整形+浮点型)(代码片段)

文章目录整形在内存中的存储1.数值类型的基本分类2.整形在内存中的存储1.原码、反码、补码2.内存中为什么要存放补码?3.大小端存储4.无符号有符号数练习5.有符号数无符号数小结浮点型在内存中的存储IEEE754整形在内存中... 查看详情

梦开始的地方——c语言指针练习题(代码片段)

指针练习注意我的环境是:win10下的VS2019-X86环境练习1intmain()inta[5]=1,2,3,4,5;int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return0;&a取出整个数组的地址,但它的地址和首元素的地址还是一样的&#x 查看详情

梦开始的地方——c语言常用字符函数汇总(代码片段)

文章目录字符库函数1.strlen(求字符串长度)2.strcpy(字符串拷贝)3.strcat(字符串追加函数)4.strcmp(字符串比较)5.strncpy(字符串拷贝)6.strncat(字符串追加)7.strncmp(字符串比较)8.strstr(字符串查找)9.strtok(字符串分割)10.strerror(错误信息)字符库... 查看详情

梦开始的地方——c语言动态内存管理(malloc+calloc+realloc+free)(代码片段)

文章目录动态内存管理1.为什么需要动态内存分配?2.动态内存函数malloc&freecallocrealloc3.常见的动态内存错误对NULL解引用对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同... 查看详情

c语言编程新手学c语言时,那些不得不注意的小细节!(代码片段)

C语言是最经典的语言,很多其他语言的运行环境也是用C来写的,对于写程序的人怎么能不懂C语言呢!提到C首先必然会让人关联到指针,当年在大学让你困惑的指针却是C语言威力无穷的基础。C语言可能从更高层... 查看详情

梦开始的地方——c语言:函数指针+函数指针数组+指向函数指针数组的指针(代码片段)

文章目录一、函数指针1.函数指针定义2.函数指针的使用3.解读函数指针代码二、函数指针数组三、指向函数指针数组的指针四、回调函数一、函数指针1.函数指针定义整形指针是指向整形的指针:存放整形的地址数组指针是... 查看详情

梦开始的地方,从最小二乘法开始学机器学习(代码片段)

梦开始的地方,从最小二乘法开始学机器学习从这篇博客开始,我们将逐步实现不同的机器学习代码,以此来深入学习了解不同的机器学习背后的原理~文章目录梦开始的地方,从最小二乘法开始学机器学习00.参考... 查看详情

梦开始的地方,从最小二乘法开始学机器学习(代码片段)

梦开始的地方,从最小二乘法开始学机器学习从这篇博客开始,我们将逐步实现不同的机器学习代码,以此来深入学习了解不同的机器学习背后的原理~文章目录梦开始的地方,从最小二乘法开始学机器学习00.参考... 查看详情

梦开始的地方——c语言(枚举+位段+联合体)(代码片段)

位段1.什么是位段?要想了解位段就得先学会使用结构体。文章链接——>详解结构体位段的声明和结构体是十分类似的,它们有两个不同之处位段的成员必须是int、unsignedint、signedint位段的成员名后面有一个冒号和数字... 查看详情

c语言攻略-从零开始的c语言生活----初阶篇(代码片段)

各位大佬大家好啊!从今天开始正式的学习C语言,就废话不多说我所使用编译器:【VisualStudio2019】目录了解什么是C语言    C语言的发展史第一个C程序——梦开始的地方数据类型数据类型所占内存大小(sizeof关... 查看详情

01梦开始的地方,阿仁的c++学习笔记(p2~)(代码片段)

...业需要的考虑和受大佬室友的影响,实习之余,本菜鸡将开始学习c++。用的是bilibil播放量最多的那个c++入门课程,环境是vscode,开此贴为笔记之用。1、第一个helloworld程序1#include<iostream>2usingnamespacestd;34intmain()56cout<<"hello... 查看详情

梦开始的地方,从最小二乘法开始学机器学习(代码片段)

梦开始的地方,从最小二乘法开始学机器学习从这篇博客开始,我们将逐步实现不同的机器学习代码,以此来深入学习了解不同的机器学习背后的原理~文章目录梦开始的地方,从最小二乘法开始学机器学习00.参考... 查看详情

闭关多日,整理一份c++中那些重要又容易忽视的细节(代码片段)

文章目录基础篇喜欢用内联函数吗?头文件与名空间,好用吧!引用返回引用的高效性何时使用引用参数?类控制对成员的访问,是公有?是私有?运算符重载面试题:C++类自动提供的成员函... 查看详情

梦开始的地方

新起点新开始自我介绍编程的目标怎么学习编程最想进入的一家IT公司自我介绍大家好,我是一名大二的学生,从小就喜欢编程,却一直没有机会去学习编程,本以为不会学编程了,机缘巧合之下我现在的专业... 查看详情

难倒c语言高手的枚举细节(代码片段)

...家好,我是小麦。我在知乎上看到这个问题,一开始,也有一些疑惑,后面查了一些资料,对于这个问题,简单的说一下我的看法。枚举有多大枚举类型到底有多大,占多少空间呢?这个要具体情... 查看详情