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 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;
}

21天学会C++:Day8----范围for与nullptr_第1张图片 

范围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。

你可能感兴趣的:(C++专题,c++,算法,数据结构)