网站首页 > java教程 正文
昨天主要讲了c语言中被忽略的知识点《断言》。其中感谢读者给我的批评意见,秉着代码是严谨的原则,在今天的正文开始前,对昨天的疏忽在此纠正一下:
第一:感谢读者@FreedomZSX 的指正,昨天我提到assert是关键字,该说法是错误的,在c语言里只是一个宏,甚至也不是一个函数。之前写java习惯了,在java里面assert被称为关键字。
第二:有读者说,直接在c文件里直接使用断言会编译不通过,我想说,我帮你验证了,并且通过了,达到了assert的效果。环境Visual Studio 2012.
第三:断言确实可以指出错误所在,但是没经过改写的断言提示的错误是一大堆,这个是我的疏忽,没有及时验证。我们公司使用的断言都是经过改写的,所以可以直指错误的地方,而不是报类似下面的错误。不过我觉得这个错误提示也应该很明显了。
好了,开始今天的正文,今天主要聊类型限定词。
类型限定词:const,volatile,restrict
1.const相信都已经很熟悉了,这个也是使用次数最多的。简要回顾一下,如果变量声明中带有关键字const,则不能通过赋值、增减量运算来修改该变量的值,否则编译器会报错。不过,还是要适当注意书写,如下:(关于const和指针变量的使用,在后续指针部分会详细说明)
2.volatile,限定词volatile告诉编译器,该变量除了可被程序改变以外还可以被其他代理改变。典型的,被用于硬件地址和与其他并行运行的程序共享的数据。举个例子,一个地址中可能保存着当前的时钟时间,不管程序做些什么,该地址的值都会随着时间而改变;同理,一个地址被用来接受来自于计算机的消息。
需要再强调的是,当要求使用volatile的变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该出读取过数据。在细说就是,遇到这个关键字的变量,编译器不在对该变量的代码进行优化,从而可以保证对特殊地址的稳定访问。
当然了,volatile和const可以同时使用,比如,硬件时钟一般设定为不能为程序所修改,但可以被程序以外的代理改变,前者就需要const限定,后者就可以加上volatile。只需要对变量声明这两个限定词就好了,顺序无所谓。
3.restrict,restrict通过允许编译器优化某几行代码增强了计算支持。只可适用于指针,并表明指针是访问数据的唯一且初始的方式。restrict是c99标准引入的。
在c库中有两个函数,都可以把一个位置把字节复制到另一个位置,在c99下,标准如下:
函数功能相同,都是把s2指向的位置复制n字节数据到s1的位置,并且均返回s1指向的位置。二者间的差别由关键字restrict造成,memcpy可以假定两个内存区域没有重叠,memove则不做这个假定。因此,复制过程类似于,首先将所有字节复制到一个临时缓冲区,然后在复制到最终目的地。如果两个区域存在重叠,在使用memcpy,就会造成不可预知的错误,即使可以正常工作,潜在的危险也是很大的。所以,在使用memcpy时,程序员必须保证区域没有重叠,使用memove则不会。
最后需要说明的是,关键字restrict有两个读者,一个是编译器,他告诉编译器可以自由的做一些有关优化的设定,另一个读者是用户,告诉用户仅适用满足restrict要求的参数。一般来说,编译器无法检查您是否遵循了这一限制,如果你忽视了它,就是在给自己挖坑了。
每天进步一点点,每天消化一点点。如果文章对你有帮助,我就觉得很值了,如果你有更好的意见,欢迎一起交流。后续我会继续更新。
猜你喜欢
- 2024-11-05 Java 进阶之异常处理(java中异常处理)
- 2024-11-05 为什么Java中的const关键字没有实现?
- 2024-11-05 Spring Boot 内置工具类(springboot 工具类调用service)
- 2024-11-05 深入理解Java:注解(Annotation)基本概念(3-1)
- 2024-11-05 Spring Boot集成validation用于优雅的校验API参数的合法性
- 2024-11-05 java初学者,如何学习java?(java该怎么学)
- 2024-11-05 Nacos网关gateway的断言,自定义断言,过滤器使用
- 2024-11-05 恕我直言,在座的各位根本不会写 Java!
- 2024-11-05 JAVA 命令之标准选项(java怎么选择)
- 2024-11-05 Java锁与线程的那些“不可描述”的事儿
你 发表评论:
欢迎- 05-16SpringBoot整合Redis实现常用功能
- 05-16基于Redis实现简单的延时消息队列
- 05-16安装Redis
- 05-16Spring系列之Redis的两种集成方式
- 05-16Django连接Redis集群问题排查思路和总结
- 05-16只需5分钟,完成Redis所有命令操作~
- 05-16熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 05-16Redis 常见业务场景及实例(Java)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)