constexpr
提到constexpr,我们会发现它和const类比
- 常和const类比
- constexpr符号常量必须给定一个在编译时已知的值,
若某个变量初始化时的值在编译时未知,但初始化后绝不变。
#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<algorithm>
//1.constexpr and type{value}
int main()
{
// 定义常量pi,值为3.1415926
constexpr double pi = 3.1415926;
// 错误:不能修改constexpr变量的值
pi = 8;
// 定义变量r,值为2.0
double r = 2.0;
// 计算圆的周长,并赋值给变量c
// 公式为:周长 = 2 * π * r
double c = 2*pi*r;
}
记住给常量赋值时的错误。
类型转换
5/2结果是2(不是2.5) ———>整型除法余数被丢弃
5.0/2.0结果是2.5 ——————>浮点型除法余数被保留
但是遇到这种混合型的呢?
2.5/2?
计算的结果准确性是第一位的,站在保证数据精确这个角度来说,肯定按照靠近存储大的类型来处理,它不会丢失数据的精确度。
2.5/2等同于2.5/double(2):算术表达式子中有double型数据的话,就按照浮点型计算,结果也是double型,否则使用整型算术计算,结果为int型。
记号type(value)和type{value}表示“将value转换为type类型,就像用值alue来初始化type类型的变量一样",使用type{value}可以防止窄化转换,而type(value)不能。
根据上述理论当遇到混合类型ing运算时,d/i会被编译器自动转换成d/double(i) ,结果为double类型,c2出现了double类型转换int类型的窄化转换,数据精确度丢丢失,而c3这里用了{}处理,防止这个double类型转换成前面的int类型,保证数据的安全。
窄化转换错误如下:
题目:摄氏度与华氏温度的转化:9/5这里就严重丢失数据
选择语句
if statement
#include"std_lib_facilities.h"
//3.if statement
int main()
{
constexpr double cm_per_inch = 2.54;
double length = 1;
char unit = 0;
cout << "Please enter a length followed by a unit (c or i):\n";
cin >> length >> unit;
if (unit == 'i')
cout << length << " in is " << length*cm_per_inch << " cm\n";
else if (unit == 'c')
cout << length << "cm is " << length / cm_per_inch << "in\n";
else
cout << "Sorry,I don't know a unit called " << unit << "\n";
}
值的注意的是else-if 不是C++语法,这是由两个if-else组合而且成的
switch statement
int main()
{
constexpr double cm_per_inch = 2.54;
double length = 1;
char unit = 0;
cout << "Please enter a length followed by a unit (c or i):\n";
cin >> length >> unit;
switch (unit){
case'i':
cout << length << " in is " << length*cm_per_inch << " cm\n";
break;
case'c':
cout << length << " cm is " << length / cm_per_inch << " in\n";
break;
default:
cout << "Sorry,I don't know a unit called " << unit << "\n";
break;
}
}
关于switch语句相关的技术细节
- switch括号里面必须是整型,字符型和枚举型,特别地,不能使用字符串型。
- case语句中的值必须是常量表达式,不能使用变量。
- 不能在两个case语句中使用相同的数值。
- 允许在一个case语句中使用多个case语句中使用多个case常量。
- 不要忘记在每个case语句末尾加上break。注意:编译器不会给出末尾加break的任何警告信息