bool、空指针、类型转换和类型系统

bool类型

true(非0),  false(0)

#include <iostream>
int main()
{
    bool isAlpha;
    isAlpha = false;
    if (!isAlpha)
    {
        std::cout << "isAlpha=" << isAlpha << std::endl;
        std::cout << std::boolalpha << "isAlpha=" << isAlpha << std::endl;
    }
    return 0;
}

 

boolalpha函数:可用来查看数据类型

空指针(nullptr)

C++11中引入保留字“nullptr”作为空指针

C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。

C语言中,空指针使用(void *)0来表示

有时候,用“NULL”来表示空指针(一种可能的实现方式是    #define NULL  0   )

auto x{ 10 };//auto 是c++11里定义的新的类型名,根据x的值来模糊化定义x的类型,此语句等于int x=10;
int* q{ nu1lptr };//这种初始化值的方法是c++11中初始化列表的方式,等于int* q = nullptr;
q=&x;

类型转换

1、隐式类型转换

  • 同一算术表达式中出现了多种不同的数据类型。转换的总原则是尽可能避免损失精度,因为此窄数据类型(占用存储空间少的类型)向宽数据类型转换(占用存储空间多的类型),具体可见下图。

            

 

  • 将一种类型的数据赋值给另一种类型的变量,会发生隐式类型转换,把赋值句右边的表达式结果转换成赋值句左边变量的类型
int a = 2;
float b = 3.4;
double c = 2.2;
b = a;    //将a的值2转换成float型的2.0再赋值给b
a = c;    //将c的值2.2转换成int型的2再赋值给a
  • 在函数调用中,若实数参数式与形参的类型不相符合,则把实参的类型转换成形参的类型。
  • 在函数返回时,若函数返回表达的值与函数声明中的返回类型不相同,则把表达式结果转换成函数返回类型
float min(int a, int b)
{
    return a < b ? a : b;
}
//return语句中的表达式结果为int,与min()函数返回类型float不同,因此会发生类型转换,将"a<b?a:b"的结果float类型后再返回给min()函数

2、显式类型转换

语言 转换方式
c

语法:(type) value   例子:printf("%d", (int) 2.5);

c++

语法:static_cast<type> value    例子:out << static_cast<double>(1) / 2;

注意运算的优先级:

std::cout << static_cast<double>(1) / 2 << std::endl;//输出0.5
std::cout << static_cast<double>(1 / 2) << std::endl;//输出0
std::cout << 1.0f / 2. << std::endl;                 //输出0.5

类型系统

先介绍一个概念:计算机程序构造块是不同大小粒度的计算机程序组成部分,它包括变量、表达式、函数或者模块等。

在编程语言中,“类型系统”是将“type”属性指定给不同计算机程序构造块的规则集。这些类型规范并强制程序员用于数据结构和组件的其它隐式类别(e.g. "string", "array of float", "function returning boolean").

优点:类型系统可以通过 1 定义不同程序块间的接口、2 检查多个块之间是否以一致的方式连接在一起的办法减少程序中可能出现的bug。

静态类型 v.s. 动态类型 :程序设计语言的类型系统机制会检查连接在一起的多个块的一致性。上述检查若发生在编译期,称为静态类型上述检查若发生在运行时,称为动态类型;上述检查若同时存在于编译期和运行时,称为混合类型。

 

posted @ 2020-05-16 14:33  我等着你  阅读(567)  评论(0)    收藏  举报