C7.【C++ Cont】范围for的使用和auto关键字
目录
1.知识回顾
2.范围for
格式
使用
运行结果
运行过程
范围for的本意
作用
注意
3.底层分析范围for的执行过程
反汇编代码
分析
4.auto关键字
格式
基本用法
在范围for中使用auto
1.知识回顾
for循环的使用参见25.【C语言】循环结构之for文章
2.范围for
C++11中引入范围for
格式
for ( 类型 变量名 : 数组名 )
{//......
}
使用
#include <iostream>
using namespace std;
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int a : arr){cout << a << " ";}return 0;
}
运行结果
运行过程
范围for的本意
将arr数组中的元素,依次放在a变量中
作用
遍历容器如数组、vector和list等
注意
1.变量的类型和数组的类型要匹配
2.其对数组中所有元素进行遍历的,但是实际在做题的
过程中可能只需要遍历数组中指定个数的元素,此时范围fo不合适
3.范围for不能修改数组元素
3.底层分析范围for的执行过程
运行环境:debug+x86
打开VS2022,先在代码生成中改动两个地方
反汇编代码
#include <iostream>
using namespace std;
int main()
{push ebp mov ebp,esp sub esp,78h push ebx push esi push edi mov ecx,offset _2A500742_leetcode@cpp (03AE068h) call @__CheckForDebuggerJustMyCode@4 (03A1389h) nop int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };mov dword ptr [arr],1 mov dword ptr [ebp-24h],2 mov dword ptr [ebp-20h],3 mov dword ptr [ebp-1Ch],4 mov dword ptr [ebp-18h],5 mov dword ptr [ebp-14h],6 mov dword ptr [ebp-10h],7 mov dword ptr [ebp-0Ch],8 mov dword ptr [ebp-8],9 mov dword ptr [ebp-4],0Ah for (int a : arr)lea eax,[arr] mov dword ptr [ebp-2Ch],eax mov eax,dword ptr [ebp-2Ch] mov dword ptr [ebp-30h],eax mov eax,dword ptr [ebp-2Ch] add eax,28h mov dword ptr [ebp-34h],eax jmp main+7Ah (03A192Ah) mov eax,dword ptr [ebp-30h] add eax,4 mov dword ptr [ebp-30h],eax mov eax,dword ptr [ebp-30h] cmp eax,dword ptr [ebp-34h] je main+8Ch (03A193Ch) mov eax,dword ptr [ebp-30h] mov ecx,dword ptr [eax] mov dword ptr [ebp-38h],ecx {}jmp main+71h (03A1921h) return 0;xor eax,eax
}pop edi pop esi pop ebx mov esp,ebp pop ebp ret
分析
上方代码较为复杂,见105.5【x86汇编】底层分析范围for的执行过程
4.auto关键字
之前在C语言的16.【C语言】初识常见关键字 上文章中提到过auto的一点内容
节选内容
auto自动:每个局部变量都由auto修饰,含义:自动创建,自动销毁
auto int a=0;等价于int a=0;
但本文讲的auto与上方不同,其让可让编译器自动推导出变量的类型
格式
auto 变量名 = 变量值;
基本用法
#include <iostream>
using namespace std;
int main()
{auto a = 1;auto b = 1.2;auto c = 'c';return 0;
}
将下列代码用VS2022打开
鼠标放在变量值旁边,会自动显示变量的类型
在范围for中使用auto
直接让编译器推测a的类型,不用手动分析
#include <iostream>
using namespace std;
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (auto a : arr){cout << a << " ";}return 0;
}