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

目录

        一.auto的定义与使用      

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

二.auto不能推导的场景

1.auto不能作为函数参数

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

三.范围for遍历 

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

        一.auto的定义与使用      

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

#include
using namespace std;
int main() {
	int a = 90;
	auto b = a;
	double x = 15.56;
	auto* c = &x;
	auto& d = x;
	cout << b << endl;
	cout << *c << endl;
	cout << d << endl;
	return 0;
}

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

C++基础——auto关键字和范围for遍历_第1张图片

 

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

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

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

 

二.auto不能推导的场景

1.auto不能作为函数参数

void TestAuto(auto a) {
	
}

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

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

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

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

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

C++基础——auto关键字和范围for遍历_第2张图片

 

三.范围for遍历 

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

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

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

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

    int main(){
    //范围for循环
	int array[] = { 1,2,3,4,5 };

	for (auto e : array) {		
		cout << e << " ";
	}
	cout << endl;
    }

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

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

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

int main() {
	//范围for循环
	int array[] = { 1,2,3,4,5 };
	cout << "更改前的数组:" << endl;

	for (auto e : array) {		//仅仅可读——只能进行遍历
		cout << e << " ";
	}
	cout << endl;

	cout << "更改后的数组:" << endl;
	for (auto e : array) {
		e *= 2;
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

 

C++基础——auto关键字和范围for遍历_第3张图片

 

你可能感兴趣的:(C++,c++)