• C++基础——auto关键字和范围for遍历


    目录

            一.auto的定义与使用      

    auto在同一行声明多个变量时:

    二.auto不能推导的场景

    1.auto不能作为函数参数

    2. auto不能直接用来声明数组

    三.范围for遍历 

            在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易,因此C++11给auto赋予了新的含义。

            一.auto的定义与使用      

            auto不是一个存储类型指示符,而是作为一 个类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

    1. #include
    2. using namespace std;
    3. int main() {
    4. int a = 90;
    5. auto b = a;
    6. double x = 15.56;
    7. auto* c = &x;
    8. auto& d = x;
    9. cout << b << endl;
    10. cout << *c << endl;
    11. cout << d << endl;
    12. return 0;
    13. }

    使用auto会自动推导a的类型——auto会有参照的对象进行推导。

     

            使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型。

    auto在同一行声明多个变量时:

    1. auto a = 1, b = 2; //正确,a,b类型相同
    2. auto c = 3, d = 4.0;//错误,c为int,d为double型出错

     

    二.auto不能推导的场景

    1.auto不能作为函数参数

    1. void TestAuto(auto a) {
    2. }

     报错原因:在建立函数栈帧时,寄存器不知道形参,就无法确定开多大空间,没有可参照的对象就无法推导。

    2. auto不能直接用来声明数组

    1. void TestAuto()
    2. {
    3. int a[] = {1,2,3};
    4. auto b[] = {456};
    5. }

    auto”类型不能出现在顶级数组类型中,具体:
    数组不能具有其中包含“auto”的元素类型,即不能出现“auto []”。

    数组的初始化是在运行期间完成的,而auto 是在编译期间就完成的(先编译后运行),所以无法推导出数组元素的类型。

     

    三.范围for遍历 

            在学习C语言的过程中,我们学习了for循环的语法格式:for(初始化;范围;自增){},我们称其为传统的for遍历方式:

    1. int main() {
    2. int array[] = { 1,2,3,4,5 };
    3. for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    4. cout << array[i] << " ";
    5. }
    6. cout << endl;
    7. }

    而今天我们来学习一种新的遍历方式:范围for遍历

            范围for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。

    1. int main(){
    2. //范围for循环
    3. int array[] = { 1,2,3,4,5 };
    4. for (auto e : array) {
    5. cout << e << " ";
    6. }
    7. cout << endl;
    8. }

    auto :推演出范围变量的数据类型。

    :e是范围变量的名称,该变量在循环迭代期间接受不同数组元素的值,即在第一次循环时,将数组的第一个元素拷贝给e,此时e的值是1;第二次循环时将数组的第二个元素拷贝给e,此时e的值是2;以此类推。每执行一次for语句,就要把相应的数组元素拷贝给变量e,使其存储起来。

           该种遍历不仅可读,还可写:

    1. int main() {
    2. //范围for循环
    3. int array[] = { 1,2,3,4,5 };
    4. cout << "更改前的数组:" << endl;
    5. for (auto e : array) { //仅仅可读——只能进行遍历
    6. cout << e << " ";
    7. }
    8. cout << endl;
    9. cout << "更改后的数组:" << endl;
    10. for (auto e : array) {
    11. e *= 2;
    12. cout << e << " ";
    13. }
    14. cout << endl;
    15. return 0;
    16. }

     

     

  • 相关阅读:
    上班族有什么靠谱的兼职副业可以做?
    设计模式总结
    85智慧楼宇建设解决方案
    Go语言的流程控制
    LeetCode 0481. 神奇字符串
    设计模式-建造者模式
    免费回收站恢复软件有哪些?数据恢复软件,这三款就足够了
    如何保证Redis和数据库数据一致性
    CTFhub-RCE-过滤空格
    Git下载安装及环境配置,解决安装包下载慢问题(详细版)
  • 原文地址:https://blog.csdn.net/weixin_69283129/article/details/127760516