当前位置: 首页 > news >正文

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

目录

​编辑

1. 范围for

2. nullptr


1. 范围for

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

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

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

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

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

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

我们来看看语法:

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

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

int main()
{list<int> l; //双向的链表l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);for (int e : l){cout << e << " ";}cout << endl;
}

 

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

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

2. nullptr

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

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

#define NULL ((void *)0)

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

void f(int)
{cout << "f(int)" << endl;
}void f(int*)
{cout << "f(int*)" << endl;
}int main()
{f(0);              //f(int)f(NULL);           //f(int)f((int*)NULL);     //f(int*)return 0;
}

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。

http://www.lryc.cn/news/164907.html

相关文章:

  • Linux——环境变量
  • Screen的详细全面安装教程及Screen的用法
  • 生成树、Prufer序列的计数问题:0912T1
  • SQL_牛客网_SQL264_求每个登陆日期的次日留存率
  • Hive 基础知识
  • 【数据结构】树的基础知识及三种存储结构
  • ABB 3BHB003688R0101接口模块
  • 精简 jre 涉坑记录
  • Java程序员学习算法路线规划总结
  • 火山引擎 ByteHouse:两个关键技术,揭秘 OLAP 引擎中的数据导入技术
  • 深挖“范围经济”穿越产业周期:TCL电子持续繁荣的密码
  • Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误
  • Swing程序设计(3)JDialog窗体
  • 类和对象(1)
  • 学会用命令行创建uni-app项目并用vscode开放项目
  • java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...
  • AIGC(生成式AI)试用 3 -- 专业主题
  • rsyslog-日志管理 logrotate-日志轮转
  • 类和对象续
  • SpringCloud:Feign实现微服务之间相互请求
  • LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722
  • [杂谈]-从硬件角度理解二进制数
  • Fast-DDS 服务发现简要概述
  • 基于spingboot的websocket订阅、广播、多人聊天室示例
  • Linux mac Windows三系统 局域网文件共享方法
  • Java——比较器
  • 【数据结构】初识泛型
  • 代码随想录--哈希--有效的字母异位词
  • MySQL——数据的增删改
  • 云服务器与http服务器