当前位置: 首页 > article >正文

C语言中易混淆概念的关键字

最快的关键字---- register register:

这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么 几个或几十个,你要是定义了很多很多 register 变量,它累死也可能不能全部把这些变量放 入寄存器吧,轮也可能轮不到你。

CPU理解为皇帝,寄存器可以理解为中转站(小太监),内存理解为大臣。从内存中那数据先放到寄存器,然后 CPU 再从寄存器里读取数据来处理,处理 完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。

注意:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉, 它从不主动干什么事。一个皇帝可能有好些小太监,那么一个 CPU 也可以有很多寄存器, 不同型号的 CPU 拥有寄存器的数量不一样。

为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只 不过其存取速度要比内存快得多。进水楼台先得月嘛,它离 CPU 很近,CPU 一伸手就拿到 数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了? 

使用register修饰符的注意点 

使用 register 修饰符也有些限制的:register 变量必须是 能被 CPU 寄存器所接受的类型。意味着 register 变量必须是一个单个的值,并且其长度应小 于或等于整型的长度。 而且 register 变量可能不存放在内存中,所以不能用取址运算符“&” 来获取 register 变量的地址。

最名不符实的关键字----static

不要误以为关键字 static 很安静,其实它一点也不安静。这个关键字在 C 语言里主要有 两个作用,C++对它进行了扩展。

修饰变量 第一个作用:修饰变量。

变量又分为局部和全局变量,但它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法 使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些 代码行也不能使用它。想要使用就得在前面再加 extern ***。想要使用方便, 直接在文件顶端定义不就得了。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他 函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。 

static int j;
void fun1(void)
{
  static int i = 0;
  i++;
  printf("%d ", i);
}
void fun2(void)
{
j = 0;
j++;
printf("%d ", j);

}
int main()
{
	for (int k = 0; k < 10; k++)
	{
		fun1();	
	}
	printf("\n");
	for (int k = 0; k < 10; k++)
	{
		fun2();
	}
	return 0;
}

修饰函数 第二个作用:修饰函数。

函数前加 static 使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函 数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件 中的函数同名。 关键字 static 有着不寻常的历史。起初,在 C 中引入关键字 static 是为了表示退出一个块后仍然存在的局部变量。随后,static 在 C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用 static 关键字来表示这第二种含义。 

 最冤枉的关键字----sizeof

常年被人误认为函数 sizeof 是关键字不是函数,其实就算不知道它是否为 32 个关键字之一时,我们也可以 借助编译器确定它的身份。

看下面的例子: int i=0; A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i; 毫无疑问,32 位系统下 A),B)的值为 4。那 C)的呢?D)的呢?

在 32 位系统下,通过 Visual C++6.0 或任意一编译器调试,我们发现 D)的结果也为 4。 咦?sizeof 后面的括号呢?没有括号居然也行,那想想,函数名后面没有括号行吗?

由此轻 易得出 sizeof 绝非函数。 好,再看 C)。编译器怎么怎么提示出错呢?不是说 sizeof 是个关键字,其后面的括号 可以没有么?那你想想 sizeof int 表示什么啊?int 前面加一个关键字?类型扩展?明显不正确,我们可以在 int 前加 unsigned,const 等关键字但不能加 sizeof。

好,记住:sizeof 在 计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。一般情况下, 乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字”。 说到底它是关键字关键字关键字

 栗子:

p是指针类型,指向的对象是char类型,32位系统下计算p的大小为4,*p的大小为1

 


http://www.kler.cn/news/314647.html

相关文章:

  • Vue+nodejs+express旅游景区门票预订网站的设计与实现 8caai前后端分离
  • MyBatis操作数据库-XML实现
  • MySQL5.7主从复制集群如何配置半同步复制
  • asp.net core调用wps实现word转pdf的方法
  • Python Selenium 自动化爬虫 + Charles Proxy 抓包
  • 十四,在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明
  • 掌握 JavaScript 中的函数表达式
  • 页面布局实现-左侧横向滑动展示隐藏数据,右侧固定展示操作按钮。可上下滑动联动
  • 常用的图像增强的算法之间的联系和区别
  • Python3网络爬虫开发实战(17)爬虫的管理和部署(第一版)
  • Samba服务
  • 传统到AI 大数据分析的演变,颠覆智慧水电的未来?
  • 【JavaEE初阶】多线程(4)
  • 2024/9/21黑马头条跟学笔记(十)
  • Ubuntu 安装和使用 Fcitx 中文输入法;截图软件flameshot
  • 从零到一:打造安全高效敦煌测评自养号体系
  • 《C++高效字符串拼接之道:解锁性能与优雅的完美结合》
  • mac系统加密文件
  • Flutter Android Package调用python
  • 基于深度学习的因果推理与决策
  • 【JVM】运行时数据区
  • Ubuntu 20.04 内核升级后网络丢失问题的解决过程
  • 《DevOps实践指南》笔记-Part 3
  • Swift里的数值变量的最大值和最小值
  • 分布式光伏发电站数据采集设备管理硬件解决方案
  • 机器学习——Stacking
  • C++速通LeetCode中等第21题-排序链表(空间O(1))
  • 828华为云征文 | 华为云X实例的镜像管理详解
  • Unexpected end of file from server 错误
  • 系统架构设计师教程 第5章 5.4 软件测试 笔记