简介
C++ 的内置数值类型可以分为整数和浮点数。整数没有小数部分,例如 0、691 和 -2;浮点数可以表示带有小数点的数值,例如 6.02214076、0.1 和 -1.616。
整数
下面的示例声明并初始化了四个不同的变量:
int m_morales{9241}; // base 10: 0-9
int a_apaec{0x24CD}; // base 16: 0-9 and A-F
int m_gargan{0b10010000011001}; // base 2: 0-1
int b_reilly{022031}; // base 8: 0-7
// Leading with a 0 not the letter o.
为 int 变量赋值时,可以直接使用字面量。字面量是直接写在代码中的数值,例如 9241。整数字面量可以采用不同进制,其中最常见的十进制使用数字 0 至 9。添加 0x 等特殊前缀后,可以使用其他进制。上面的示例展示了数值 9241 的四种写法及其前缀,四个变量的初始值相同。
有关不同进制的更多说明,请阅读这篇简短教程。
可以用单引号分隔数字,以提高可读性。9'241、0b0100'100'0001'1001 和 92'4'1 表示相同的值。
浮点数
浮点字面量有两种常见写法。除了直观的 0.0024,也可以使用科学计数法 2.4e-3。最常用的浮点类型是 double。
算术运算
C++ 支持使用 +、-、*、/、(、) 和 % 构成表达式。两个整数参与本节的算术运算时,结果仍是整数,因此 5 / 2 得到 2。如果参与运算的一个数是浮点数,结果也为浮点数,5.0 / 2 和 5 / 2.0 都得到 2.5。% 是取余运算符,返回整数除法的余数,例如 5%3 得到 2。
赋值运算符
赋值运算符把右侧的值写入左侧变量,赋值方向是从右到左,而不是反过来。
int length = 5;
int width = 2;
length = width;
示例先把整数 5 赋给 length,再把整数 2 赋给 width,最后把 width 的值复制给 length,覆盖原来的 5。这里只复制赋值发生时 width 的值,因此以后再修改 width,不会影响已经赋给 length 的值。
赋值运算符还可以与算术或位运算符结合,构成复合赋值运算符,例如 +=、-=、*=、/= 和 %=。它们对变量当前的值进行运算,并将结果写回该变量。
// we start with 0 people
int people{};
// we need 0 eggs
int eggs{};
// two people joined:
people += 2;
// people is now 2
// let's add 3 eggs per person
eggs += 3 * people;
// eggs is now 6
示例把 people 和 eggs 都初始化为 0。先在 people 的现有值 0 上加 2 并写回,使其变成 2。随后为每个人增加 3 个鸡蛋,共增加 6 个,再将其加到 eggs 的现有值 0 上并写回,使其变成 6。等价表达式分别是 people = people + 2 和 eggs = eggs + (3 * people)。
任务说明
本练习需要编写一些工具函数,帮助自由职业者与项目经理沟通报价,快速计算日费和月费,并可按给定比例减免。
首先,双方约定以下规则:
- 日费是时薪的 8 倍。
- 每月有 22 个计费工作日。
自由职业者有时会对日费提供优惠,例如面向长期客户或非营利客户。
优惠比例用浮点百分数表示,例如 25.0 表示减免 25%。
1. 根据时薪计算日费
实现 daily_rate 函数,以时薪为参数计算日费。合同规定每天有 8 个计费小时。
daily_rate(60)
// => 480.0
返回的日费应当是 double 类型。
2. 计算优惠后的价格
实现 apply_discount 函数,计算优惠后的价格。函数接收两个参数:原价和减免百分比。
apply_discount(150, 10)
// => 135.0
返回值始终为 double,不要进行任何取整。
3. 根据时薪和优惠比例计算月费
实现 monthly_rate 函数,计算优惠后的月费。函数接收时薪和减免百分比两个参数。
monthly_rate(77, 10.5)
// => 12130
返回的月费应向上取整到最接近的整数。
4. 根据预算、时薪和优惠比例计算完整工作日数
实现 days_in_budget 函数,接收预算、时薪和优惠比例,计算该预算能支付多少个完整工作日。
days_in_budget(20'000, 80, 11.0)
// => 35
返回的天数应向下取整到整数。