基于范围的for循环

2023-11-17

一、基于范围的for循环(C++11)

1.范围for的语法

2.范围for的使用条件

二、指针空值nullptr

一、基于范围的for循环(C++11)

1.范围for的语法

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。
因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

#include<iostream>
using namespace std;
void test()
{
	//范围for,当前的数据:循环范围
	//也可以用continue结束本次循环,break跳出整个循环
	//范围for的表示
    int arr[] = { 1,2,3,4,5 };
	for (int e : arr)
	{
		cout << e << " ";
	}
	cout << endl;
	//引用
	for (const int& e : arr)
	{
		cout << e << " ";
	}
	cout << endl;
	//auto关键字
	for (const auto& e : arr)
	{
		cout << e << " ";
	}

	cout << endl;
}
int main()
{
	test();
	return 0;
}

在这里插入图片描述

2.范围for的使用条件

for循环迭代的范围必须是确定的!

//当数组作为函数参数时,数组名退化为指针,不能使用范围for
void fun(int arr[], int n)
{
	for (const auto& e : arr)
	{
		cout << e << " ";
	}
	cout << endl;
}

二、指针空值nullptr

//NULL指针
int* p=NULL;
//NULL指针实际是一个宏,即define NULL=0

在传统的C头文件(stddef.h)中,可以看到如下代码

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,例如当我们定义一个f(int*)函数时。

#include<iostream>
using namespace std;
void fun(int a)
{
	cout << "fun(int)" << endl;
}
void fun(int* a)
{
	cout << "fun(int*)" << endl;
}
void test()
{
	fun(NULL);
	fun((int*)NULL);
	fun(nullptr);
	//查看nullptr的变量类型
	cout << typeid(nullptr).name() << endl;
}
int main()
{
	test();
	return 0;
}

在这里插入图片描述当传入的参数为NULL时,调用的是fun(int)函数而不是fun(int*)函数,因为NULL被定义为0,要想调用fun(int*)需要进行类型转换(int*)NULL。这时可以用nullptr指针空值,从上述结果可以看到调用的是fun(int*)函数,指针类型为nullptr_t。
注意

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于范围的for循环 的相关文章

随机推荐

  • 20道JavaScript经典面试题

    该篇文章整理了一些前端经典面试题 附带详解 涉及到JavaScript多方面知识点 满满都是干货 建议收藏阅读 前言 如果这篇文章有帮助到你 关注 点赞 鼓励一下作者 文章公众号首发 关注 前端南玖 第一时间获取最新的文章 1 说一说Jav
  • Android增强现实(一)-AR的三种方式(展示篇)

    有一段时间没写博客了 事情比较多 博客进度有点跟不上了 1 Android增强现实 一 AR的三种方式 展示篇 2 Android增强现实 二 支持拖拽控制进度和伸缩的VrGifView 3 Android增强现实 三 3D模型展示器 这段
  • 安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计&WebPack打包器&第三方库JQuery&安装使用&安全检测

    文章内容 环境搭建 NodeJS 解析安装 库安装 安全问题 NodeJS 注入 RCE 原型链 案例分析 NodeJS CTF题目 源码审计 打包器 WebPack 使用 安全 第三方库 JQuery 使用 安全 环境搭建 NodeJS
  • TestComplete数据驱动测试教程(三)——修改记录测试

    TestComplete是一款具有人工智能的自动UI测试工具 利用自动化测试工具和人工智能支持的混合对象识别引擎 轻松检测和测试每个桌面 Web和移动应用程序 本文中我们将讲解如何进行数据驱动的测试 方便大家更快更直接的学习TestComp
  • c++的常用库

    c 的常用库 C 资源大全 关于 C 框架 库和资源的一些汇总列表 内容包括 标准库 Web应用框架 人工智能 数据库 图片处理 机器学习 日志 代码分析等 标准库 C 标准库 包括了STL容器 算法和函数等 C Standard Libr
  • 用C++封装一个Ocr文字识别程序,离线识别,完全免费

    程序封装了RapidOcr模块 源文件路径Tree信息如下 文件夹 PATH 列表 卷序列号为 43EE 6931 D build windows bat CMakeLists txt CMakeSettings json Ocr cpp
  • Centos7版本的安装超级详细

    Centos7的安装超级详细 关于Centos版本下载地址 https archive kernel org centos vault CentOS 7 0 1406 x86 64 DVD iso 标准安装版 一般下载这个就可以了 Cent
  • 线程创建的三种方法

    继承Thread类 1 继承Thread类 2 重写run 方法 3 调用start 方法开启线程 public class testThread1 extends Thread Override public void run run 方
  • Qt浅谈之一:内存泄露(总结)

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • 谷歌chrome浏览器的源码分析(一)

    随着网络技术的发展 越来越多应用都已经离不开网络 特别像人类大脑一样的知识库的搜索引擎 更加是离不开功能强大的云计算 不过 即便云计算非常强大 但它还不能直接地把结果呈现给用户 这样就需要一个客户端来呈现出来 这个客户端就是浏览器 现在越来
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt
  • std::thread线程命名

    也可以参考我另外一篇文章 另外一篇更详细些 为线程设置名字的最大的好处是在程序出错时 它会出现在 GDB 的出错信息里 可以更快地定位问题 有两种方法可以给线程设置名字 一种在线程的调用函数内部设置 还有一种是在外部对指定线程变量做设置 i
  • 【软件测试】未来软件测试必备的8大技能,你缺少哪几个?

    软件测试工程师是个神奇的职业 他是开发人员与老板之间的传话筒 三夹板 也是开发人员与老板的好帮手 他不仅需要有销售的沟通能力 也需要具备编辑人员的文档撰写技巧 如此一个面面俱到的岗位 他需要具备的技能到底有哪些呢 有逆向思维的能力 曾经采访
  • 算法:两个有序数组合并成一个有序数组 java语言

    题目 有两个有序数组a 和b 将它们合并成数组c 需要c 也是有序数组 思路 新建一个以两个集合长度之和为长度的新数组 从两数组最左边开始比起 把小的放入新集合 并用变量标记后一位置 每次比较都是比较的最左边未比较过的元素 通过变量 循环比
  • 分享一个可交互的小场景(二)

    先看效果 可互动的小场景 再看代码 JS部分
  • 正点原子I.MX6ULL开发板车牌识别项目实战 1

    1 项目总体概述 下图为 车牌识别项目 的系统框图 借助这个框图 简要介绍项目的总体思路和所需要做的准备工作 1 1 总体思路 通过摄像头采集图像信息 并将图像信息传递开发板 这里使用的是OpenCv 开发板收到图像信息之后 通过定时器 周
  • Python解决ModuleNotFoundError: No module named 'Queue'的问题

    我们知道Python2和Python3两个版本之间 有些不兼容的地方 Python3中引入Queue会报出这个问题 Python3中要这样引入 1 import queue Python2中要这样引入 1 import Queue 为了兼容
  • 第十六课,面剔除

    使用OpenGL的面剔除选项 它默认是禁用状态 glEnable GL CULL FACE 直接运行后 我们发现正方体的部分面确实被剔除了 但是却不是背向面 这是因为我们定义的正方体并不是严格遵循逆时针顺序定义的 原理详见教程 这里就不过多
  • python输出文本 去掉引号,如何从导出的python列表中删除逗号,引号和括号?

    You guys were super helpful with my last newbie question so I figured I would give it another shot Right now my Python 3
  • 基于范围的for循环

    一 基于范围的for循环 C 11 1 范围for的语法 2 范围for的使用条件 二 指针空值nullptr 一 基于范围的for循环 C 11 1 范围for的语法 对于一个有范围的集合而言 由程序员来说明循环的范围是多余的 有时候还会