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