白沟17网站一起做网店,有啥方法下载wordpress主题,主机如何做服务器建网站,网站制作西安企业网站制作数据类型 (Data type) int, long int, double, struct, char *, float [], int (*f)()… 计算机程序构造块
计算机程序构造块是不同大小粒度的计算机程序组成部分#xff0c;它包括变量、表达式、函数或者模块等。
类型系统 (Type System)
类型系统#xff1a;在编程语言中…数据类型 (Data type) int, long int, double, struct, char *, float [], int (*f)()… 计算机程序构造块
计算机程序构造块是不同大小粒度的计算机程序组成部分它包括变量、表达式、函数或者模块等。
类型系统 (Type System)
类型系统在编程语言中“类型系统”是将“type”属性指定给不同计算机程序构造块的规则集 为什么使用类型系统减少程序中可能出现的bug 1、定义不同程序块之间的接口 2、检查多个块之间是否以一致的方式连接在一起 类型系统分为静态类型和动态类型 类型系统存在于我们编写程序中编译器会帮我们检查类型系统。 如果检查发生在编译期编译的时候检查类型系统是否一致称为静态类型 如果检查发生在运行期执行的时候检查类型系统是否一致称为动态类型 如果检查同时存在与编译期间和运行期间称为混合类型 C、C、Java是静态类型 Python是动态类型
Automatic Type Deduction: auto (C11) 自动类型推导auto关键字
C03及之前的标准种auto放在变量声明之前声明变量的存储策略。但是这个关键字常省略不写。 C11中auto关键字放在变量之前作用是在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型 例
int a 10;
auto au_a a;//自动类型推断au_a为int类型
cout typeid(au_a).name() endl;result: int 注意点 1、auto 变量必须在定义时初始化这类似于const关键字
auto a1 10; //正确
auto b1; //错误,编译器无法推导b1的类型
b1 10;2、定义在一个auto序列的变量必须始终推导成同一类型
auto a4 10, a5{20}; //正确
auto b4{10}, b5 20.0; //错误,没有推导为同一类型3、如果初始化表达式是引用或const则去除引用或const语义。
int a{10}; int b a;
auto c b; //c的类型为int而非int去除引用
const int a1{10};
auto b1 a1; //b1的类型为int而非const int去除const 4、如果auto关键字带上号则不去除引用或const语意
int a 10; int b a;
auto d b;//此时d的类型才为int
const int a2 10;
auto b2 a2;//因为auto带上故不去除constb2类型为const in5、初始化表达式为数组时auto关键字推导类型为指针
int a3[3] { 1, 2, 3 };
auto b3 a3;
cout typeid(b3).name() endl; //输出int * 输出与编译器有关6、若表达式为数组且auto带上则推导类型为数组类型
int a7[3] { 1, 2, 3 };
auto b7 a7;
cout typeid(b7).name() endl; //输出int [3] 输出与编译器有关7、C14中auto可以作为函数的返回值类型和参数类型
auto max(int x , int y)
{return xy?x:y;
}我们在使用auto时有时会遇到一些特殊情况。 1、 “int x 3;” 能变成auto形式吗 当我们非常希望能够在变量定义的时候【明确】地指出变量的类型而且不希望随便更改其类型那么我们可以使用下面的方法 auto x int {3}; // 初始化列表auto y int {3.0}; // 编译器报错初始化列表不能窄化auto z int (3.0); // C风格的强制类型转换z的值是整数32、 auto和初始化列表一起用 要避免在一行中使用直接列表初始化和拷贝列表初始化也就是下面的代码是有问题的 auto x { 1 }, y { 2 }; // 不要同时使用直接和拷贝列表初始化“AAA原则”总是使用auto 问题能用auto声明C风格的数组吗 如果你尝试让C11编译器编译如下代码它会报错
// 包含头文件
// 声明主函数
// ......
auto x[] {1,2,3};auto 不能用于声明数组否则无法通过编译报auto类型不能出现在顶级数组类型中。 也就是说auto只能是指针指向数组的而不能去声明一个数组。
自动类型推导decltype关键字
1、关键字decltype的用法 decltype利用已知类型声明新变量。 有了auto为什么还要整出一个decltype原因是我们有时候想要从表达式的类型推断出要定义的变量类型但不想用该表达式的值初始化变量。 decltype是在编译期推导一个表达式的类型而不用初始化其语法格式有点像sizeof。它只做静态分析因此它不会导致已知类型表达式执行。 decltype 主要用于泛型编程模板 2、代码示例
#includeiostream
using namespace std;
int fun1() { return 10; }
auto fun2() { return g; } // C14
int main(){// Data type of x is same as return type of fun1()// and type of y is same as return type of fun2()decltype(fun1()) x; // 不会执行fun1()函数相当于 int x;decltype(fun2()) y fun2(); //auto ychar y;cout typeid(x).name() endl;cout typeid(y).name() endl;return 0;
}我们可以发现我们将fun2的‘g’改变例如改成4y类型也改了。 这样我们修改了返回值类型程序仍然能够正常运行。 这说明使用类型推导是有好处的。 3、decltype与auto的对比 decltype和auto都是C11自动类型推导的关键字。它们有很多差别 auto忽略最上层的constdecltype则保留最上层的const auto忽略原有类型的引用decltype则保留原有类型的引用 对解引用操作auto推断出原有类型decltype推断出引用
4、auto推断时会实际执行decltype不会执行只做分析。 总之在使用中过程中和const、引用和指针结合时需要特别小心。
小结
C11对C03的增强或者说C11的“Modern”的特点之一就是由auto和decltype构成的自动类型推导系统。
但是auto与初始化列表结合又有一些坑。你在写代码时如果经常将auto与列表初始化一起使用那么会遇到一些问题。本节只介绍auto的常见用法。auto与初始化列表结合的坑得由你自己去踩了。
为了说明auto有多么复杂这里摘取 https://cppreference.com 网站列出的auto的语法格式