为什么要推行政务公开网站建设,江苏做帖子网站,wordpress文章字体,做兼职比较好的网站CSDN的uu们#xff0c;大家好。这里是C入门的第七讲。 座右铭#xff1a;前路坎坷#xff0c;披荆斩棘#xff0c;扶摇直上。 博客主页#xff1a; 姬如祎 收录专栏#xff1a;C专题 目录
1. 知识引入
2. auto的使用
2.1 auto与指针和引用结合起来使用
2.2 在同一… · CSDN的uu们大家好。这里是C入门的第七讲。 · 座右铭前路坎坷披荆斩棘扶摇直上。 · 博客主页 姬如祎 · 收录专栏C专题 目录
1. 知识引入
2. auto的使用
2.1 auto与指针和引用结合起来使用
2.2 在同一行定义多个变量
2.3 auto不能推导的场景
2.3.1 auto不能作为函数的参数
2.3.2 auto不能直接用来声明数组 3. auto与范围for的结合 1. 知识引入
曾记否我们在用C语言实现基础的数据结构时会用到结构体来作为链表的一个节点像这样
struct ListNode
{struct ListNode* next;int val;
};int main()
{struct ListNode node;
}我们在使用这个节点的时候前面的变量类型就要写这么多是不是很烦很不舒服。当然你也可能会觉得这还好啊不久两个单词嘛。但是在C的后续学习过程中你可能会遇到这样的变量类型
#includemap
#includestringint main()
{std::mapstd::string, std::string::iterator a;
}
这样看下来是不是觉得写变量的类型还是真的有些麻烦。不过聪明的UU可能想到可以用 typedef 给变量区别名来达到简化的效果非常棒但是呢C引入了一种更为简单的方式 C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。 意思就是auto关键字能够自动推导变量的类型。当然你是用 auto 时编译器无法推出变量的类型就会报错的啦
int main()
{auto a 10; //正确的写法auto e; //错误的写法
}
2. auto的使用
int main()
{auto e;
}
上面提到 这种写法是不正确的原因是什么呢来看看标准化的解释 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。 2.1 auto与指针和引用结合起来使用 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须 加。 int main()
{auto a 10;auto pa1 a;auto* pa2 a;auto ra a; //声明引用必须加cout typeid(a).name() endl;cout typeid(pa1).name() endl;cout typeid(pa2).name() endl;cout typeid(ra).name() endl;}
为什么声明引用必须加上呢原因很简单拿上面的例子来说不加只是声明了一个 int 类型的变量然后赋值为 a 的值。另外我们可以使用 typeid(变量).name() 来查看变量的类型。 2.2 在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 2.3 auto不能推导的场景
2.3.1 auto不能作为函数的参数
void Func1(auto b) //错误的写法
{}void Func2(auto a 10) //错误的写法
{}
代码会编译失败auto不能作为形参类型因为编译器无法对a的实际类型进行推导。缺省的参数也不行哦
2.3.2 auto不能直接用来声明数组
auto a[4] { 1,2,3,4 }; //错误的写法 3. auto与范围for的结合
在C98中我们要遍历数组会写出这样的代码
int main()
{int a[10] { 0,1,2,3,4,5,6,7,8,9 };for (int i 0; i sizeof(a) / sizeof(a[0]); i)cout a[i] ;
} 但是这种鞋码对于一个本身就有范围的集合来说我们还去自己写代码来指定他的范围就显得有些多余了甚至可能哈辉犯错误因此C11中引入了基于范围的for循环。for循环后的括号由冒号(:)分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。
int main()
{int a[10] { 0,1,2,3,4,5,6,7,8,9 };for (int i 0; i sizeof(a) / sizeof(a[0]); i)cout a[i] ;for (auto i : a)cout i ;for (int i : a)cout i ;
} 上面的三种写法都是等效的可以使用auto来自动推导得到的变量类型。 注意与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环。 你如果要改变原数组的值你可以使用引用哦像下面这样
int main()
{int a[10] { 0,1,2,3,4,5,6,7,8,9 };for (int i 0; i sizeof(a) / sizeof(a[0]); i)a[i] 1;for (auto i : a)i 1;for (int i : a)i 1;
}
范围for循环的底层是使用迭代器来完成遍历的操作的。至于迭代器是个啥后面会讲到