Bootstrap

C++基础:constexpr,类型转换和选择语句

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的任何警告信息

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;