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

用于C++的对象关系映射库—YB.ORM

1 介绍YB.ORM

在这里插入图片描述
YB.ORM 旨在简化与关系数据库交互的 C++ 应用程序的开发。

对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作,这种方法可能不是对每个数据库应用程序都是最佳的,但它被证明在需要复杂逻辑和事务处理的应用程序中是合理的。

虽然这是一个正在进行的项目,但大多数功能都已经完成。

YB.ORM 项目的目标是:

  • 为 C++ 开发人员提供方
  • 便的 API
  • 保持C++的高性能
  • 保持源代码在不同平台和编译器之间轻松移植
  • 支持大多数主要的关系数据库管理系统(DBMS)

该工具使用了 Martin Fowler 在《企业应用程序架构模式》一书中解释的许多概念,即“延迟加载”、“身份映射”、“工作单元”等模式。同时,项目开发受到启发借助 Java 的Hibernate框架的强大功能,尤其是 Python 的SQLAlchemy设计。

对象关系映射

此部分可以参考我的另外一篇文章:https://blog.csdn.net/weixin_42887343/article/details/120664818

关系数据库现在非常普遍——从 Oracle 集群到嵌入式 SQLite 基于文件的数据库,关系数据库以具有列和行的矩形表的形式对数据进行操作。

从应用程序代码连接 SQL 数据库并不容易,看看普通的ODBC API 就知道了,针对数据库运行 SQL 语句的典型步骤可能包括以下内容:

  • 连接数据库,提供参数:主机、端口、模式、用户名、密码等。
  • 使用连接句柄,创建游标并准备SQL 语句,以文本形式提供 SQL 语句
  • 使用游标句柄,可选择将输出参数绑定到您的输出变量,这些变量将在提取完成时接收它们的值
  • 使用游标句柄,可选择将输入参数(位置参数或命名参数)绑定到您的输入变量
  • 可选地为输入变量分配它们的值
  • 使用游标,执行准备好的语句,可选择继续执行步骤 5
  • 可选择获取结果集的下一行,如果确定则查看您的输出变量,可选择重复第 7 步
  • 关闭游标
  • 关闭连接

YB.ORM库的使用

使用 ORM 从模型定义开始。它可能看起来像一个带有表和关系的 XML 文件,或者像一个类声明中的内联宏,或者一个处理访问者的模板函数。此步骤可能需要也可能不需要代码生成或某种其他类型的预处理。这些变体中的每一个都有其自身的优点和缺点。

让我们考虑一个具有两个实体的示例架构:Client和Order。它们之间是一对多的关系:一个Client可能有零个,也可能有多个Orders,每一个都Order属于一个Client。Clients存储在 table 中client_tbl,而它们的Orders 存储在 table 中order_tbl。

在 SQL 级别,该关系可以表示为子表中的列引用父表中的主键列的外键约束。从 ORM 的角度来看,这种关系通常由对象的属性来表示。类的实例具有对象引用属性,引用类的单个父对象。从关系的另一端看,一个类的实例可能有一个对象集合属性(也称为“ ”),可以用来遍历它的所有子对象。client_id order_tblid client_tblOrderClientClientbackrefOrder

让我们定义映射模式以及两个类Client和Order。

#include "orm/domain_object.h"
#include "orm/domain_factory.h"
#include "orm/schema_decl.h"
class Order;
class Client: public Yb::DomainObject {
YB_DECLARE(Client, "client_tbl", "client_seq", "client",YB_COL_PK(id, "id")YB_COL_DATA(dt, "dt", DATETIME)YB_COL_STR(name, "name", 100)YB_COL_STR(email, "email", 100)YB_COL_DATA(budget, "budget", DECIMAL)YB_REL_ONE(Client, owner, Order, orders, Yb::Relation::Restrict, "client_id", 1, 1)YB_COL_END)
public:int get_info() const { return 42; }
};
class Order: public Yb::DomainObject {
YB_DECLARE(Order, "order_tbl", "order_seq", "order",YB_COL_PK(id, "id")YB_COL_FK(client_id, "client_id", "client_tbl", "id")YB_COL(dt, "dt", DATETIME, 0, 0, Yb::Value("sysdate"), "", "", "", "")YB_COL_STR(memo, "memo", 100)YB_COL_DATA(total_sum, "total_sum", DECIMAL)YB_COL_DATA(paid_sum, "paid_sum", DECIMAL)YB_COL_DATA(paid_dt, "paid_dt", DATETIME)YB_REL_MANY(Client, owner, Order, orders, Yb::Relation::Restrict, "client_id", 1, 1)YB_COL_END)
public:const Yb::Decimal to_be_paid() {return total_sum - paid_sum.value(0);}
};

这些类声明可以放在标题或.cpp文件中。您的.cpp文件中还需要两句话才能使魔术生效:

YB_DEFINE(Client)
YB_DEFINE(Order)

类Client和Order会自动获得一些新的数据成员和方法。现在类的每个对象都有映射属性(id, dt, , …)。name这些属性可用于以读取和写入模式访问列数据,以及检查是否存在缺失值 ( IS NULL)。

要控制映射类的实例,必须有一个类的实例Yb::Session,它负责加载/保存对象、跟踪更改、控制关系等。在创建时,Session将数据库方案传递给它。

int main() {Yb::init_schema();  // gather all declarations in one schemaYb::Session session(Yb::theSchema(), "sqlite+sqlite://./tut1.db");session.create_schema(true);  // create schema if necessary

现在你可以像那样立即使用域类:

Order order;order.total_sum = Yb::Decimal("3.14");order.paid_sum = Yb::Decimal(0);order.save(session);Client client;client.name = "Some Name";client.email = "some@email";client.dt = Yb::now();client.save(session);order.owner = Client::Holder(client);session.commit();return 0;
}

您可以编译示例,链接库ybutil和yborm,然后它就可以运行了。如果你愿意,你可以打开日志记录来查看引擎盖下发生了什么:

#include "util/nlogger.h"
#include <iostream>
...Yb::LogAppender appender(std::cerr);Yb::init_schema();  // gather all declarations in one schemaYb::Session session(Yb::theSchema(), "sqlite+sqlite://./tut1.db");session.set_logger(Yb::ILogger::Ptr(new Yb::Logger(&appender)));

以下是特定于 SQLite 数据库引擎的日志消息:

14-10-27 14:19:38.489 21962/21962 DEBG sql: exec_direct: CREATE TABLE client_tbl ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, dt TIMESTAMP, name VARCHAR(100), email VARCHAR(100), budget NUMERIC 
) 
14-10-27 14:19:38.818 21962/21962 DEBG sql: exec_direct: CREATE TABLE order_tbl ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, client_id INTEGER NOT NULL, dt TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, memo VARCHAR(100), total_sum NUMERIC, paid_sum NUMERIC, paid_dt TIMESTAMP , FOREIGN KEY (client_id) REFERENCES client_tbl(id) 
) 
14-10-27 14:19:38.842 21962/21962 DEBG orm: flush started 
14-10-27 14:19:38.843 21962/21962 DEBG sql: begin transaction 
14-10-27 14:19:38.843 21962/21962 DEBG sql: 
prepare: INSERT INTO client_tbl (dt, name, email, budget) VALUES (?, ?, ?, ?) 
14-10-27 14:19:38.843 21962/21962 DEBG sql: bind: (DateTime, String, String, Decimal) 
14-10-27 14:19:38.843 21962/21962 DEBG sql: exec prepared: p1="'2014-10-27 
14:19:38'" p2="'Some Name'" p3="'some@email'" p4="NULL" 
14-10-27 14:19:38.844 21962/21962 DEBG sql: 
prepare: SELECT SEQ LID FROM SQLITE_SEQUENCE WHERE NAME = 'client_tbl' 
14-10-27 14:19:38.844 21962/21962 DEBG sql: exec prepared: 
14-10-27 14:19:38.844 21962/21962 DEBG sql: fetch: LID='1' 
14-10-27 14:19:38.844 21962/21962 DEBG sql: fetch: no more rows 
14-10-27 14:19:38.845 21962/21962 DEBG sql: prepare: INSERT INTO order_tbl 
(client_id, dt, memo, total_sum, paid_sum, paid_dt) VALUES (?, ?, ?, ?, ?, ?) 
14-10-27 14:19:38.845 21962/21962 DEBG sql: bind: (LongInt, DateTime, String, Decimal, Decimal, DateTime) 
14-10-27 14:19:38.845 21962/21962 DEBG sql: exec prepared: p1="1" 
p2="'2014-10-27 14:19:38'" p3="NULL" p4="3.14" p5="0" p6="NULL" 
14-10-27 14:19:38.845 21962/21962 DEBG sql: 
prepare: SELECT SEQ LID FROM SQLITE_SEQUENCE WHERE NAME = 'order_tbl' 
14-10-27 14:19:38.846 21962/21962 DEBG sql: exec prepared: 
14-10-27 14:19:38.846 21962/21962 DEBG sql: fetch: LID='1' 
14-10-27 14:19:38.846 21962/21962 DEBG sql: fetch: no more rows 
14-10-27 14:19:38.846 21962/21962 DEBG orm: flush finished OK 
14-10-27 14:19:38.846 21962/21962 DEBG sql: commit

注意正确的插入顺序(第一个 - 父母,第二个 - 孩子)。这是通过对对象图进行拓扑排序来实现的。外键的值是自动分配的,主键的值也是如此。

如果我们从另一端操纵对象之间的链接,也可以达到同样的效果:

//order.owner = Client::Holder(client);
client.orders.insert(order);

域类对于构造查询特别有用。例如,我们需要一个针对特定客户订单的寻呼机,让我们从 30 到 39(含)之间获取商品:

#include <boost/foreach.hpp>
...Yb::DomainResultSet<Order> rs = Yb::query<Order>(session) .filter_by(Order::c.client_id == 32738) .order_by(Order::c.dt) .range(30, 40).all(); BOOST_FOREACH(Order order, rs) { std::cout << order.id << ","; }

在这里,我们可以看到在不同 SQL 方言中实现不同的功能。例如,对于 SQLite,将发出以下 SQL 代码:

SQL:
SELECT order_tbl.id, order_tbl.client_id, order_tbl.dt, order_tbl.memo, order_tbl.total_sum, order_tbl.paid_sum, order_tbl.paid_dt 
FROM order_tbl WHERE (order_tbl.client_id = ?)
ORDER BY order_tbl.dt
LIMIT ? OFFSET ?positional params: (32738, 10, 30)

有关更多示例、下载和任何进一步信息,请访问项目主页https://sourceforge.net/projects/yborm/。

原文链接:https://www.codeproject.com/Articles/834803/Quick-Introduction-to-YB-ORM-Object-Relational-Map

相关文章:

用于C++的对象关系映射库—YB.ORM

1 介绍YB.ORM YB.ORM 旨在简化与关系数据库交互的 C 应用程序的开发。 对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作&#xff0c;这种方法可能不是对每个数据库应用程序都是最佳的&#xff0c;但它被证明在需要复杂逻辑和事务处理的应用程…...

Cesium 100K数据加载 支持弹窗 动态更改位置

前言&#xff1a;今天总结关于point、label、billboard海量数据加载。后续会研究下大量model加载以及大bim(几百G上T)模型记载 海量点加载 弹窗 加载点位时&#xff0c;不加载弹窗。点击点位时在加载弹窗&#xff0c;及有效的减少加载量&#xff0c;优化性能。 const handler …...

MySQL管理表

在创建表时需要提前了解mysql里面的数据类型 常见的数据类型 创建表 创建表方式1&#xff1a; 格式&#xff1a; CREATE TABLE [IF NOT EXISTS] 表名( 字段1, 数据类型 [约束条件] [默认值], 字段2, 数据类型 [约束条件] [默认值], 字段3, 数据类型 [约束条件] [默认值], ………...

【Java 面试合集】打印一个int整数的32位表示

打印一个int整数的32位表示 1. 概述 嗨&#xff0c;大家好【Java 面试合集】又来了&#xff0c;今天给大家分享的主题是打印一个int整数的32位表示. 2. 32位分析 2.1 为什么是32位呢 不知道看到这篇文章的各位是否都知道&#xff0c;一个int类型的表示方式就是32位呢&#x…...

这样在管理后台里实现 403 页面实在是太优雅了

前言403 页面通常表示无权限访问&#xff0c;与 404 页面代表着不同含义。而大部分管理后台框架仅提供了 404 页面的支持&#xff0c;但却忽略了对 403 页面的处理&#xff0c;有的框架虽然也有对 403 页面的处理&#xff0c;但处理效果却不尽人意。那怎么样的 403 页面才是即好…...

c++提高篇——STL常用算法

STL常用算法一、常用遍历算法一、for_each 遍历容器二、transform 搬运容器到另一个容器中二、常用查找算法一、find二、find_if三、adjacent_find四、binary_search五、count六、count_if三、常用排序算法一、sort二、random_shuffle三、 merage四、reverse四、常用拷贝和替换…...

Materials - DistanceField Nodes

以前的相关笔记&#xff0c;归档发布&#xff1b;距离场相关节点&#xff1a;DistanceToNearestSurface节点&#xff1a;求出传入的Position位置到最近的面的距离并输出&#xff0c;在没有Position输入的时候&#xff0c;默认值会直接使用World Position&#xff1a;Position的…...

【ARMv8 编程】ARMv8 指令集介绍

ARMv8 架构中引入的最重要的变化之一是增加了 64 位指令集。该指令集补充了现有的 32 位指令集架构。这种增加提供了对 64 位宽整数寄存器和数据操作的访问&#xff0c;以及使用 64 位长度的内存指针的能力。新指令被称为 A64&#xff0c;以 AArch64 执行状态执行。ARMv8 还包括…...

大数据之Phoenix基本介绍

文章目录前言一、Phoenix简介二、Phoenix入门&#xff08;一&#xff09;创建表语法&#xff08;二&#xff09;查看表信息&#xff08;三&#xff09;删除表&#xff08;四&#xff09;大小写问题前言 #博学谷IT学习技术支持# 上篇文章介绍了Phoenix环境搭建&#xff0c;点击…...

算法leetcode|38. 外观数列(多语言实现)

文章目录38. 外观数列&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgocpythonjava38. 外观数列&#xff1a; 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字…...

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2&#xff0c;axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML)&#xff1a;异步的 Jav…...

Android自定义View实现打钩签到动画

效果图实现原理我们看实现的动画效果&#xff0c;其实是分为1. 绘制未选中状态图形&#xff08;圆弧和对号&#xff09;2. 绘制选中状态圆弧的旋转的动画3. 绘制选中状态圆弧向中心收缩铺满动画4. 绘制选中状态对号5. 绘制选中状态下圆的放大回弹动画6. 暴露接口接口回调传递选…...

python+pytest接口自动化(3)-接口测试一般流程及方法

首先我们要明确&#xff0c;通常所接口测试其实就属于功能测试&#xff0c;主要校验接口是否实现预定的功能&#xff0c;虽然有些情况下可能还需要对接口进行性能测试、安全性测试。在学习接口自动化测试之前&#xff0c;我们先来了解手工接口测试怎样进行。URL组成为了更好的理…...

《MySQL学习》 表中随机取记录的方式

一.初始化测试表 创建表 words CREATE TABLE words ( id int(11) NOT NULL AUTO_INCREMENT, word varchar(64) DEFAULT NULL, PRIMARY KEY (id)) ENGINEInnoDB;插入测试数据 create procedure idata()begin declare i int; set i 0; while i<10000 do insert into words…...

功率信号源有什么作用和功能呢

功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器&#xff0c;它具有高电压、大功率的特点&#xff0c;在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等&#xff0c;可以有效的帮助电子工程师解决驱动负载和放大功率的问题。功率信号源和功率放大器…...

一些cmake error fixed

建完虚拟环境后 运行 pip install . 出现报错&#xff0c;显示svox2安装出错&#xff0c;然后开始进入到svox2中进行手动编译和安装。 1. cmake svox2/csrc pybind11找不到 conda install pybind11用 pip install 在虚拟环境中安装不行&#xff0c;据说会安装到全局下… 2. c…...

CentOS 7安装Docker并使用tomcat测试

文章目录环境准备Docker安装安装tomcat环境准备 CentOS 7以上版本linux内核版本需要在3.10以上&#xff0c;可通过uname -r 查看系统内核。 Docker安装 检查docker安装源 yum list docker yum安装docker &#xff1a; yum install docker.x86_64 启动 docker &#xff1a; s…...

隐私计算头条周刊(2.20-2.26)

开放隐私计算收录于合集#企业动态45个#周刊合辑45个#政策聚焦38个#隐私计算92个#行业研究37个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播…...

安装kibana 报错/访问不了

安装kibana 报错1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题2&#xff0c;elasticsearch 和kibana版本不一致3&#xff0c;索引问题1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题 我的RPM安装的&#xff0c;配置文件都在/etc/ vim /etc/elasticsearc…...

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…...

MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU FLASH

MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU 32BIT 256KB FLASH 144LQFP【说明】Kinetis K6x MCU系列是一个可扩展的组合&#xff0c;具有不同级别的集成&#xff0c;提供丰富的模拟、通信、定时和控制外设套件&#xff0c;以适应广泛的需求。应用楼宇自动化控制器人…...

Prometheus 告警模块配置深度解析

本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置&#xff0c;也可以通过配置文件配置。命令行用来配置不可变的系统参数&#xff0c;配置文件用来定义限制规则用于通知路由和通知接收者。 Alertmana…...

《分布式技术原理与算法解析》学习笔记Day23

分布式数据复制 我们在进行分布式数据存储设计时&#xff0c;通常会考虑对数据进行备份&#xff0c;以提高数据的可用性和可靠性&#xff0c;“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术&#xff1f; 在分布式数据库系统中&#xff0c;通常会设置主备…...

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…...

一起Talk Android吧(第五百零八回:多层布局功能)

文章目录功能介绍使用方法示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"图片滤镜ImageFilterView",这一回中咱们说的例子是" 多层布局功能"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;功能介绍 我…...

丁小喜の兵器谱(学生管理系统)

我的第一个独立看需求完成项目&#xff0c;虽然很简单&#xff08;笑&#xff09;建立一个可以增加&#xff0c;修改&#xff0c;删除&#xff0c;展示学生信息的系统首先是一个界面&#xff0c;让你决定进行哪个操作1.2.3.4.5分别对应不同的操作&#xff0c;switch与这一操作完…...

linux:字符串拷贝的五种方法:使用指针下标,指针变量加偏移量,指针变量自加等

字符串数组名做函数形参&#xff0c;会退化正指针变量&#xff0c;需要使用指针变量操作字符串 代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

cesium常用方法汇集(工具篇)

1.Scene.prototype.pickPositionWorldCoordinates 根据屏幕坐标获取世界坐标 2&#xff0c;Scene.prototype.pickPosition 根据屏幕坐标获取世界坐标 3&#xff0c;Scene.prototype.drillPick 通过屏幕坐标拾取多个对象 4&#xff0c;Scene.prototype.pickFromRay 通过射线拾…...

分布式一致性与共识算法(一)

这里写目录标题是什么ACIDCAP组合一致性概念共识为什么需要共识算法会如何发展列举Paxos算法ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;协议Raft 算法参考引用是什么 从实现效果上来说&#xff0c;很多人或多或少都了解或者设计过具有强一致性的系统。但是&#…...

C++---最长上升子序列模型---怪盗基德的滑翔翼(每日一道算法2023.2.27)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方&#xff0c;就是他每次都能逃脱中…...

广州做网站厉害的公司/营销策略4p分析怎么写

在部署应用的时候&#xff0c;有时候应用可以直接启动&#xff0c;但偶尔应用却无法启动&#xff0c;报错信息是&#xff1a; java.sql.SQLRecoverableException: IO Error: Got minus one from a read call 如图&#xff1a; 原因及解决方法 我有好几个应用系统需要连接数据…...

wordpress编辑器没有16px/网络营销的平台有哪些

一、导读 本文主要内容包括数组转换成List&#xff0c;List转成数组&#xff0c;List转成map的几种方式。 好文章 记得 收藏点赞关注 &#xff01;&#xff01;&#xff01; 二、代码 /*** 练习数组转list&#xff0c;list转数组&#xff0c;list转map** author JiaMing* sin…...

云浮网站建设兼职/长沙做搜索引擎的公司

本届TechEd 2009微软技术大会&#xff0c;将于2009年11月5日-7日在北京国家会议中心隆重开幕&#xff01;不过目前微软还没有给出详细的课程信息&#xff0c;只知道会有6个技术发布&#xff1a;Windows7、Windows Server 2008 R2、Exchange Server 2010、Forefront、System Cen…...

如何做平台网站/常州百度关键词优化

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化Mutation 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件&#xff…...

wordpress是哪家公司的建站程序/成都网站制作费用

一、背景知识Oralce中的一张表数据量达到亿数量级后或是单表达到2G大小&#xff0c;查询效率似乎会明显下降。需要通过分区的方式&#xff0c;从行的维度对表进行划分&#xff0c;避免单表数据量过大分区方法有下面几类&#xff1a;范围&#xff0c;最常见&#xff0c;按照某列…...

wordpress亲子模板下载/免费b站在线观看人数在哪里找到

在c言语中pow()函数是用来求x的y次幂。x、y及函数值都是double型 &#xff0c;其语法为“double pow(double x, double y)”&#xff1b;个中参数“double x”示意底数&#xff1b;参数“double y”示意指数。pow()函数用来求x的y次幂&#xff0c;x、y及函数值都是double型 &am…...