hibernate查询缓存_Hibernate查询缓存如何工作

hibernate查询缓存

介绍

现在,我已经介绍了实体和集合缓存,现在该研究查询缓存的工作原理了。

查询缓存与实体严格相关,它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样,查询缓存也不像人们想象的那么琐碎。

实体模型

对于我们的测试用例,我们将使用以下域模型:

postauthorquerycache

Post实体与Author 具有多对一关联,并且两个实体都存储在第二级缓存中。

启用查询缓存

默认情况下,查询缓存处于禁用状态,要激活它,我们需要提供以下Hibernate属性:

properties.put("hibernate.cache.use_query_cache", Boolean.TRUE.toString());

为了使Hibernate缓存给定的查询结果,我们需要在创建Query时显式设置cachable查询属性 。

直读缓存

查询缓存是只读的 ,就像NONSTRICT_READ_WRITE并发策略一样 ,它只能使过时的条目无效。

在下一个示例中,我们将缓存以下查询:

private List<Post> getLatestPosts(Session session) {return (List<Post>) session.createQuery("select p " +"from Post p " +"order by p.createdOn desc").setMaxResults(10).setCacheable(true).list();
}

首先,我们将使用以下测试案例来研究查询缓存的内部结构:

doInTransaction(session -> {LOGGER.info("Evict regions and run query");session.getSessionFactory().getCache().evictAllRegions();assertEquals(1, getLatestPosts(session).size());
});doInTransaction(session -> {LOGGER.info("Check get entity is cached");Post post = (Post) session.get(Post.class, 1L);
});doInTransaction(session -> {LOGGER.info("Check query result is cached");assertEquals(1, getLatestPosts(session).size());
});

该测试生成以下输出:

QueryCacheTest - Evict regions and run queryStandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache        
EhcacheGeneralDataRegion - Element for key sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
is null
StandardQueryCache - Query results were not found in cacheselectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ 
fromPost querycache0_ 
order byquerycache0_.created_on desc limit 10StandardQueryCache - Caching query results in region: org.hibernate.cache.internal.StandardQueryCache; timestamp=5872026465492992
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2
value: [5872026465492992, 1]JdbcTransaction - committed JDBC Connection------------------------------------------------------------QueryCacheTest - Check get entity is cachedJdbcTransaction - committed JDBC Connection------------------------------------------------------------QueryCacheTest - Check query is cachedStandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
StandardQueryCache - Checking query spaces are up-to-date: [Post]EhcacheGeneralDataRegion - key: Post
UpdateTimestampsCache - [Post] last update timestamp: 5872026465406976, result set timestamp: 5872026465492992
StandardQueryCache - Returning cached query resultsJdbcTransaction - committed JDBC Connection
  • 清除所有缓存区域,以确保缓存为空
  • 运行查询后,查询缓存将检查以前存储的结果
  • 因为没有缓存条目,所以查询转到数据库
  • 所选实体和查询结果均被缓存
  • 然后,我们验证Post实体是否存储在二级缓存中
  • 后续查询请求将从缓存中解决,而无需访问数据库

查询参数

查询参数嵌入在缓存条目键中,如以下示例所示。

基本类型

首先,我们将使用基本的类型过滤:

private List<Post> getLatestPostsByAuthorId(Session session) {return (List<Post>) session.createQuery("select p " +"from Post p " +"join p.author a " +"where a.id = :authorId " +"order by p.createdOn desc").setParameter("authorId", 1L).setMaxResults(10).setCacheable(true).list();
}
doInTransaction(session -> {LOGGER.info("Query cache with basic type parameter");List<Post> posts = getLatestPostsByAuthorId(session);assertEquals(1, posts.size());
});

查询缓存条目如下所示:

EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ inner joinAuthor querycache1_ on querycache0_.author_id=querycache1_.id wherequerycache1_.id=? order byquerycache0_.created_on desc;parameters: ; named parameters: {authorId=1}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
value: [5871781092679680, 1]

该参数存储在高速缓存条目键中。 缓存条目值的第一个元素始终是结果集的获取时间戳。 以下元素是此查询返回的实体标识符。

实体类型

我们还可以使用实体类型作为查询参数:

private List<Post> getLatestPostsByAuthor(Session session) {Author author = (Author) session.get(Author.class, 1L);return (List<Post>) session.createQuery("select p " +"from Post p " +"join p.author a " +"where a = :author " +"order by p.createdOn desc").setParameter("author", author).setMaxResults(10).setCacheable(true).list();
}
doInTransaction(session -> {LOGGER.info("Query cache with entity type parameter");List<Post> posts = getLatestPostsByAuthor(session);assertEquals(1, posts.size());
});

缓存条目与我们之前的示例相似,因为Hibernate仅将实体标识符存储在缓存条目键中。 这很有意义,因为Hibernate已经缓存了Author实体。

EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ inner joinAuthor querycache1_ on querycache0_.author_id=querycache1_.id wherequerycache1_.id=? order byquerycache0_.created_on desc;parameters: ; named parameters: {author=1}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
value: [5871781092777984, 1]

一致性

HQL / JPQL查询无效

Hibernate二级缓存偏向于强一致性,而查询缓存也不例外。 与刷新一样,只要关联的表空间发生更改,查询缓存就可以使其条目无效。 每次我们持久/删除/更新实体时 ,使用该特定表的所有查询缓存条目都将失效。

doInTransaction(session -> {Author author = (Author) session.get(Author.class, 1L);assertEquals(1, getLatestPosts(session).size());LOGGER.info("Insert a new Post");Post newPost = new Post("Hibernate Book", author);session.persist(newPost);session.flush();LOGGER.info("Query cache is invalidated");assertEquals(2, getLatestPosts(session).size());
});doInTransaction(session -> {LOGGER.info("Check Query cache");assertEquals(2, getLatestPosts(session).size());
});

该测试将添加一个新的Post ,然后重新运行可缓存的查询。 运行此测试将给出以下输出:

QueryCacheTest - Insert a new Postinsert 
intoPost(id, author_id, created_on, name) 
values(default, 1, '2015-06-06 17:29:59.909', 'Hibernate Book')UpdateTimestampsCache - Pre-invalidating space [Post], timestamp: 5872029941395456
EhcacheGeneralDataRegion - key: Post value: 5872029941395456QueryCacheTest - Query cache is invalidated
StandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2StandardQueryCache - Checking query spaces are up-to-date: [Post]
EhcacheGeneralDataRegion - key: Post
UpdateTimestampsCache - [Post] last update timestamp: 5872029941395456, result set timestamp: 5872029695619072
StandardQueryCache - Cached query results were not up-to-dateselectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ 
fromPost querycache0_ 
order byquerycache0_.created_on desc limit 10StandardQueryCache - Caching query results in region: org.hibernate.cache.internal.StandardQueryCache; timestamp=5872029695668224
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
value: [5872029695668224, 2, 1]JdbcTransaction - committed JDBC ConnectionUpdateTimestampsCache - Invalidating space [Post], timestamp: 5872029695680512
EhcacheGeneralDataRegion - key: Post value: 5872029695680512------------------------------------------------------------QueryCacheTest - Check Query cacheStandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2StandardQueryCache - Checking query spaces are up-to-date: [Post]
EhcacheGeneralDataRegion - key: Post
UpdateTimestampsCache - [Post] last update timestamp: 5872029695680512, result set timestamp: 5872029695668224
StandardQueryCache - Cached query results were not up-to-dateselectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ 
fromPost querycache0_ 
order byquerycache0_.created_on desc limit 10StandardQueryCache - Caching query results in region: org.hibernate.cache.internal.StandardQueryCache; timestamp=5872029695705088
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
value: [5872029695705088, 2, 1]JdbcTransaction - committed JDBC Connection
  • 一旦Hibernate检测到Entity状态转换 ,它就会使受影响的查询缓存区域预先失效
  • 不会删除查询缓存条目,但会更新其关联的时间戳
  • 查询缓存始终检查条目键时间戳,如果键时间戳比结果集加载时间戳新,则它会跳过读取其值。
  • 如果当前会话重新运行此查询,则结果将再次被缓存
  • 当前数据库事务的提交和更改从会话级隔离传播到常规读取一致性
  • 发生实际的无效,并且缓存条目时间戳再次被更新

这种方法可能破坏READ COMMITTED一致性保证,因为可能进行脏读 ,因为在提交数据库事务之前,当前隔离的更改会传播到Cache。

本机查询无效

正如我前面提到 ,本机查询Hibernate留在黑暗中,因为它可以不知道本地查询最终可能会修改其表。 在以下测试中,我们将更新Author表,同时检查它对当前Post Query Cache的影响:

doInTransaction(session -> {assertEquals(1, getLatestPosts(session).size());LOGGER.info("Execute native query");assertEquals(1, session.createSQLQuery("update Author set name = '\"'||name||'\"' ").executeUpdate());LOGGER.info("Check query cache is invalidated");assertEquals(1, getLatestPosts(session).size());
});

测试生成以下输出:

QueryCacheTest - Execute native queryUpdateTimestampsCache - Pre-invalidating space [Author], timestamp: 5872035446091776
EhcacheGeneralDataRegion - key: Author value: 5872035446091776
UpdateTimestampsCache - Pre-invalidating space [Post], timestamp: 5872035446091776
EhcacheGeneralDataRegion - key: Post value: 5872035446091776updateAuthor 
setname = '"'||name||'"'QueryCacheTest - Check query cache is invalidatedStandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2StandardQueryCache - Checking query spaces are up-to-date: [Post]
EhcacheGeneralDataRegion - key: Post
UpdateTimestampsCache - [Post] last update timestamp: 5872035446091776, result set timestamp: 5872035200290816
StandardQueryCache - Cached query results were not up-to-dateselectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ 
fromPost querycache0_ 
order byquerycache0_.created_on desc limit 10StandardQueryCache - Caching query results in region: org.hibernate.cache.internal.StandardQueryCache; timestamp=5872035200364544
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 
value: [5872035200364544, 1]JdbcTransaction - committed JDBC ConnectionUpdateTimestampsCache - Invalidating space [Post], timestamp: 5872035200372736
EhcacheGeneralDataRegion - key: Post value: 5872035200372736
UpdateTimestampsCache - Invalidating space [Author], timestamp: 5872035200372736
EhcacheGeneralDataRegion - key: Author value: 5872035200372736

即使仅修改了Author表, AuthorPost缓存区域也都无效。 为了解决这个问题,我们需要让Hibernate知道我们要更改哪些表。

本机查询缓存区域同步

Hibernate允许我们通过查询同步提示来定义查询表空间。 提供此信息时,Hibernate可以使请求的缓存区域无效:

doInTransaction(session -> {assertEquals(1, getLatestPosts(session).size());LOGGER.info("Execute native query with synchronization");assertEquals(1, session.createSQLQuery("update Author set name = '\"'||name||'\"' ").addSynchronizedEntityClass(Author.class).executeUpdate());LOGGER.info("Check query cache is not invalidated");assertEquals(1, getLatestPosts(session).size());
});

正在生成以下输出:

QueryCacheTest - Execute native query with synchronizationUpdateTimestampsCache - Pre-invalidating space [Author], timestamp: 5872036893995008
EhcacheGeneralDataRegion - key: Author value: 5872036893995008updateAuthor 
setname = '"'||name||'"'QueryCacheTest - Check query cache is not invalidatedStandardQueryCache - Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
EhcacheGeneralDataRegion - 
key: sql: selectquerycache0_.id as id1_1_,querycache0_.author_id as author_i4_1_,querycache0_.created_on as created_2_1_,querycache0_.name as name3_1_ fromPost querycache0_ order byquerycache0_.created_on desc;parameters: ; named parameters: {}; max rows: 10; transformer: org.hibernate.transform.CacheableResultTransformer@110f2StandardQueryCache - Checking query spaces are up-to-date: [Post]
EhcacheGeneralDataRegion - key: Post
UpdateTimestampsCache - [Post] last update timestamp: 5872036648169472, result set timestamp: 5872036648226816
StandardQueryCache - Returning cached query resultsJdbcTransaction - committed JDBC ConnectionUpdateTimestampsCache - Invalidating space [Author], timestamp: 5872036648263680
EhcacheGeneralDataRegion - key: Author value: 5872036648263680

只有提供的表空间无效,离开了邮政查询缓存不变。 可以将本机查询和查询缓存混合使用,但是需要一些努力。

结论

查询缓存可以提高频繁执行的实体查询的应用程序性能,但这不是免费的。 它容易受到一致性问题的影响,并且如果没有适当的内存管理控制机制,它很容易变得很大。

代码可在GitHub上获得 。

翻译自: https://www.javacodegeeks.com/2015/06/how-does-hibernate-query-cache-work.html

hibernate查询缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教你快速了解C语言基本结构

点击上方蓝字关注我&#xff0c;了解更多咨询在步入C语言程序世界之前&#xff0c;不要对C语言产生恐惧感&#xff0c;觉得这种语言应该是学者或研究人员的专利。C语言是人类共有的财富&#xff0c;是普通人只要通过努力学习就可以掌握的知识。下面通过一个简单的程序来看一看C…

提高mysql insert速度_让你的insert操作速度增加1000倍的方法

大家平时都会使用insert语句,特别是有时候需要一个大批量的数据来做测试,一条一条insert将会是非常慢的,那么我们如何让我们的inser更快呢。很多时候方法选对了对于我们做事将会是事半功倍。大家平时都会使用insert语句,特别是有时候需要一个大批量的数据来做测试,一条一条inse…

C语言中同名变量,作用域怎么确定?

点击上方蓝字关注我&#xff0c;了解更多咨询C中通常会声明很多变量&#xff0c;变量有不同的作用域。如果出现同名变量&#xff0c;作用域怎么确定&#xff1f;这里先看结论&#xff1a;块中的变量作用域不同&#xff0c;内层块会隐藏外层块中的定义。但离开内层块后&#xff…

C语言基础知识干货收藏

点击上方蓝字关注我&#xff0c;了解更多咨询算法结构&#xff1a;一、顺序结构、选择结构、循环结构&#xff1b;二、循环结构又分为while型、until型、for循环结构&#xff1b;程序流程图&#xff1b;结构化程序设计方法&#xff1a;&#xff08;1&#xff09;自顶向下&#…

python xlrd读取文件报错_python中xlrd库如何实现文件读取?

俗话说得好&#xff0c;技多不压身&#xff0c;虽然我们已经掌握了多种可以实现读取文件的方式&#xff0c;但是丝毫不影响我们要学会精益求精&#xff0c;他说学习文件读取的奥秘&#xff0c;况且&#xff0c;数据分析是十分重要的&#xff0c;一切的代码运行&#xff0c;总归…

c语言 %x,%d,%c,%s,%x各代表什么

点击上方蓝字关注我&#xff0c;了解更多咨询转换说明符%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)%c 字符%d 有符号十进制整数%f 浮点数(包括float和doulbe)%e(%E) 浮点数指数输出[e-(E-)记数法]%g(%G) 浮点数不显无意义的零”0″%i 有符号十进制整数(与%d相同)%u 无符号…

apache mesos_Apache Mesos + Marathon和Java EE

apache mesosApache Mesos是一个开放源代码群集管理器&#xff0c;可在分布式应用程序或框架之间提供有效的资源隔离和共享。 Apache Mesos从计算机&#xff08;物理或虚拟&#xff09;中提取CPU&#xff0c;内存&#xff0c;存储和其他计算资源&#xff0c;从而使容错和弹性的…

C语言表达式用法快来看看

点击上方蓝字关注我&#xff0c;了解更多咨询表达式是C语言的主体。在C语言中&#xff0c;表达式由操作符和操作数组成。最简单的表达式可以只含有一个操作数。根据表达式所含操作符的个数&#xff0c;可以把表达式分为简单表达式和复杂表达式两种&#xff0c;简单表达式是只含…

python导入模块报错_Python 导入上层目录模块报错

背景&#xff1a;当前demo.py 文件&#xff0c;所处目录 D:\py\test\TestCase&#xff0c;需要调用test 目录下的模块&#xff0c;尝试了 新建__init__.py 文件 import test.模块名的方法&#xff0c;无效.报错信息&#xff1a;D:\py\test\TestCase>python demo.pyTraceback…

java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」?

关于Java传参时是引用传递还是值传递&#xff0c;一直是一个讨论比较多的话题。有人说Java中只有值传递&#xff0c;也有人说值传递和引用传递都是存在的&#xff0c;比较容易让人产生疑问。关于值传递和引用传递其实需要分情况看待。一、Java数据类型我们都知道&#xff0c;Ja…

C语言中变量的存储类别

点击上方蓝字关注我&#xff0c;了解更多咨询在程序中经常会使用到变量&#xff0c;在C程序中可以选择变量的不同存储形式&#xff0c;其存储类别分为静态存储和动态存储。可以通过存储类修饰符来告诉编译器要处理什么样的类型变量&#xff0c;具体主要有自动&#xff08;auto&…

javafx 项目_JavaFX,Jigsaw项目和JEP 253

javafx 项目因此&#xff0c; Java 9可能会破坏您的代码 …… 如果您的项目使用JavaFX&#xff0c;则这尤其可能&#xff0c;因为许多自定义和自制控件都需要使用内部API。 借助Project Jigsaw&#xff0c;这些内容将无法在Java 9中访问。幸运的是&#xff0c; Oracle在几天前…

C语言结构体用法很多,坑也很多

点击上方蓝字关注我&#xff0c;了解更多咨询还在使用89年版C语言的Linux内核&#xff0c;现在终于要做出改变了。今天&#xff0c;Linux开源社区宣布&#xff0c;未来会把内核C语言版本升级到C11&#xff0c;预计5.18版之后生效&#xff0c;也就是今年5月。这个决定很突然&…

java 消息队列服务_ActiveMQ 消息队列服务

1 ActiveMQ简介1.1 ActiveMQ是什么ActiveMQ是一个消息队列应用服务器(推送服务器)。支持JMS规范。1.1.1 JMS概述全称&#xff1a;Java Message Service &#xff0c;即为Java消息服务&#xff0c;是一套java消息服务的API标准。(标准即接口)实现了JMS标准的系统&#xff0c;称之…

第一个C语言编译器是怎样编写的?

点击上方蓝字关注我&#xff0c;了解更多咨询以我们嵌入式开发中经常使用的C语言为例&#xff0c;我们来介绍一下第一个C语言编译器的来源。还是让我们回顾一下C语言历史&#xff1a;1970年Tomphson和Ritchie在BCPL&#xff08;一种解释型语言&#xff09;的基础上开发了B语言&…

C语言fgets()函数:以字符串形式读取文件

点击上方蓝字关注我&#xff0c;了解更多咨询C语言 fgets() 函数从文本文件中读取一个字符串&#xff0c;并将其保存到内存变量中。fgets() 函数位于 <stdio.h> 头文件中&#xff0c;其使用格式如下&#xff1a;fgets(字符串指针,字符个数n,文件指针);格式说明&#xff1…

摆脱冷气_摆脱匿名类

摆脱冷气我真的很喜欢编写和阅读lambda表达式-它们简洁&#xff0c;富于表现力和时尚&#xff08;来吧&#xff0c;这样就没关系了&#xff01;&#xff09;。 将此与匿名类进行比较。 这就是为什么我喜欢摆脱它们&#xff01; 在过去的几个月里&#xff0c;这种认识慢慢地实现…

深入了解C语言

点击上方蓝字关注我&#xff0c;了解更多咨询c语言在编程语言中是偏底层的语言&#xff0c;像JavaScript&#xff0c;以及java。都是在c语言的基础上编译出来的。像操作系统&#xff1a;unix &#xff0c;linux &#xff0c;windows都是依靠c语言开发出来的&#xff0c;使用c语…

C语言函数注意点有哪些?

点击上方蓝字关注我&#xff0c;了解更多咨询构成C程序的基本单位是函数 C语言程序是由函数构成的&#xff0c;不存在过程。函数名代表该函数的入口地址C语言函数可以嵌套调用&#xff0c;例如&#xff1a;fun(fun(x)) &#xff1b;于C语言中&#xff0c;子程序的…

C语言中的逻辑值

点击上方蓝字关注我&#xff0c;了解更多咨询C语言中的逻辑值1.C语言中的逻辑值2.逻辑运算符的运算规律3.逻辑值的举例说明一&#xff0e;C语言中的逻辑值逻辑值即逻辑运算操作的结果。在C语言中&#xff0c;逻辑运算包括关系运算与逻辑运算。关系运算包括大于(>),小于(<…