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

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

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt/C++ 多线程同步机制详解及应用
  • redis 十大应用场景
  • 特种作业管理系统 —— 企业安全与效率的卓越保障
  • EfficientViT(2023CVPR):具有级联组注意力的内存高效视觉Transformer!
  • 8. 详细描述一条 SQL 语句在 MySQL 中的执行过程。
  • jQuery国内大厂CDN加速链接
  • 本地生活商城开发搭建 同城O2O线上线下推广
  • 【SpringBoot整合Redis测试Redis集群案例】
  • 一、Kafka入门
  • Cursor免费 GPT-4 IDE 工具的保姆级使用教程
  • windows GetUserNameEx api使用c++
  • 【C#生态园】C#任务调度库大比拼:选择最适合你项目的工具
  • Hive 的窗口函数 详解
  • C# 继承父类,base指定构造函数
  • 钢管加工长度检测系统源码分享
  • 【附node操作实例】redis简明入门系列—字符串类型
  • bearychat的java client
  • k8s 面向应用开发者的基础命令
  • Linux CTF 逆向入门
  • Linux中的硬链接与软链接
  • mysql_config not found
  • PAT A1050
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React 快速上手 - 07 前端路由 react-router
  • Spring声明式事务管理之一:五大属性分析
  • Vue2 SSR 的优化之旅
  • 大整数乘法-表格法
  • 翻译:Hystrix - How To Use
  • 前端技术周刊 2019-01-14:客户端存储
  • 我有几个粽子,和一个故事
  • 译有关态射的一切
  • 再次简单明了总结flex布局,一看就懂...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​水经微图Web1.5.0版即将上线
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (52)只出现一次的数字III
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十三)Flink SQL
  • (转)jQuery 基础
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET MVC第三章、三种传值方式
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 的字符串暂存池
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • []T 还是 []*T, 这是一个问题