• 21天学会C++:Day8----范围for与nullptr


    目录

    ​编辑

    1. 范围for

    2. nullptr


    1. 范围for

    我们在写C语言循环遍历代码的时候,无论是用 for循环,while循环都需要考虑循环的起始条件,循环变量的递增逻辑,循环的结束条件。麻烦不说还可能会出错。

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

    为了简化单纯做遍历操作时的代码,C++引入了一个名叫范围for的东东,就是一个语法糖。

    有了范围for我们遍历arr数组就可以这样书写代码:

    1. int main()
    2. {
    3. int arr[] = { 1, 2, 3, 4, 5 };
    4. for (int e : arr)
    5. {
    6. cout << e << " ";
    7. }
    8. cout << endl;
    9. }

     无论如何是比直接些for循环舒服多了。

    我们来看看语法:

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

    在数组中被迭代的范围就是数组第一个元素到最后一个元素。如果是其他的数据结构,比如stl中的list等等,底层都是使用迭代器来实现的。(迭代器我们后面才会讲解哦,先随便看看吧)

    1. int main()
    2. {
    3. list<int> l; //双向的链表
    4. l.push_back(1);
    5. l.push_back(2);
    6. l.push_back(3);
    7. l.push_back(4);
    8. l.push_back(5);
    9. for (int e : l)
    10. {
    11. cout << e << " ";
    12. }
    13. cout << endl;
    14. }

     

    范围for括号的最前面是容器里面元素的类型,你如果不想写可以用去偷关键字替代。像下面的代码这样,就更加方便了。

    1. int main()
    2. {
    3. int arr[] = { 1, 2, 3, 4, 5 };
    4. for (auto e : arr)
    5. {
    6. cout << e << " ";
    7. }
    8. cout << endl;
    9. }

    2. nullptr

    我们思考一下为什么C语言有NULL了,为什么C++还要引入nullptr呢?座位面试的常考题,大家可要仔细想一想。

    NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

    #define NULL ((void *)0)

     他是将0强制转化为了无类型的指针,使得NULL可能存在多种定义!到底是0呢,还是个无类型的指针呢?让我们看看下面的代码:

    1. void f(int)
    2. {
    3. cout << "f(int)" << endl;
    4. }
    5. void f(int*)
    6. {
    7. cout << "f(int*)" << endl;
    8. }
    9. int main()
    10. {
    11. f(0); //f(int)
    12. f(NULL); //f(int)
    13. f((int*)NULL); //f(int*)
    14. return 0;
    15. }

    f(NULL)调用的函数是不是很奇怪,我们本来是想让他调用f(int*)的,但是由于NULL的定义导致程序背离了我们的意图。这就是NULL的缺陷。

    在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下 将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

    于是C++引入了nullptr关键字,注意是关键字。nullptr是一个空指针类型,仅仅使用nullptr表示空指针。而NULL却可以代表0。

    注意:

    1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

    2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

    3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

  • 相关阅读:
    Js获取指定字符串指定字符位置&指定字符位置区间的子串【简单详细】
    npm作用域包和版本
    Java 多线程
    View绘制流程1-View与Window的关系
    前端学习基础知识
    Excel 数据透视表教程大全之 01 什么是数据透视表 如何创建数据透视表
    vue3按需引入 vite-plugin-style-import 2.0版本报错(解决办法)
    猿创征文|信息抽取(1)——pytorch实现BiLSTM-CRF模型进行实体抽取
    Python Tensorflow1.x升级到2.x低阶API实践
    微软发布Phi-3 Mini,性能媲美GPT-3.5、Llama-3,可在手机端运行
  • 原文地址:https://blog.csdn.net/m0_73096566/article/details/132839318