在线装修网,seo案例模板,这么开网站,如何在电脑安装wordpressC入门#xff08;1#xff09;链接入口 文章目录 内联函数auto关键字注意事项 基于范围的for循环(C11)nullptr 内联函数
以inline修饰的函数叫做内联函数#xff0c;编译时C编译器会在调用内联函数的地方展开#xff0c;没有函数调用建立栈帧的开销#xff0c;内联函数提…C入门1链接入口 文章目录 内联函数auto关键字注意事项 基于范围的for循环(C11)nullptr 内联函数
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。
//内联函数 inline
inline int Add(int x, int y)
{return x y;
}
//不同建立栈帧提高函数效率
int main()
{cout Add(1, 2) endl;return 0;//内联函数向编译器发送请求编译器可以忽略这个请求
}在C语言中我们会用到宏定义#define 处理一些替换如简单的函数复杂的数据变量名貌似宏定义与内联函数是相同的
但实际上是有很大的区别的 内联函数是真实的函数可以像普通函数一样进行调试、类型调查和自动类型转换。它们可以包含类的成员变量并且可以在编译阶段将函数嵌入到调用处。而宏定义只是简单的文本替换不进行类型检查和类型转换且只是在预编译阶段进行替换没有任何调错机会一旦有错误在编译前就无法实现。 所以内联函数不要把声明和定义分离开来最好就在同一文件下进行。
auto关键字
在C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。也就是说auto可以自动识别类型
初步测试
int main()
{int a 10;char b 2;double c 2.0;int* d a;float e 1.0;auto a1 a;auto b1 b;auto c1 c;auto d1 d;auto* d2 d;auto d3d;//auto和auto*是没有什么区别的//auto进行引用时就必须使用auto因为auto是对类型进行判断引用相当于别名所以要加auto e1 e;cout typeid(a1).name() endl;cout typeid(b1).name() endl;cout typeid(c1).name() endl;cout typeid(d1).name() endl;cout typeid(e1).name() endl;}对于目前阶段来说auto无法体现出真正的价值但在C中定义类型时有时可不只是一个int或者float可以比的
#includestring
#includevectorint main()
{vectorstring v;vectorstring::iterator it v.begin();auto it v.begin();//上下的类型一样//auto在定义对象时类型较长时用它很方便
}注意事项
不可作为参数
void func(auto a)
{//auto不可作为参数编译器无法对a的实际类型进行推导//传参的内容是拷贝主参的所以对于函数来说都是参数值无法进行类型推导
}返回值 在VS2022中已经支持auto作为返回值但最好还是不要用作为返回值有一定的风险性如果没有返回值或者没有参数那么对于这个函数的返回值是无的。
//可以作为返回值
auto func(int a)
{return a;
}同一行多个变量
//同一行多个变量
void Testauto()
{auto a 1, b 2;auto c 1, d d;//错误的//在同一行进行多个变量定义时必须是类型相同的因为auto只对第一个变量进行识别判断
}不可作为数组
void Testauto()
{int a[] { 1,2,3 };auto b[] { 1,2,3 };//错误的//auto不可用来声明数组
}基于范围的for循环(C11)
对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因此C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。
void TestFor2()
{int array[] {1,2,3,4,5};//引用e取数组中每个值//e取完一个值后会自动1cout array[0] endl;for (auto e : array){cout e endl;}
}void TestFor2()
{int array[] {1,2,3,4,5};//引用e取数组中每个值//e取完一个值后会自动1for (auto e : array){e * 2;}cout array[0] endl;for (auto e : array){cout e endl;}
}由于这种范围for比较方便相对的使用这种for循环也有一定的条件要求 for循环迭代的范围必须是确定的。对于数组而言就是数组中第一个元素和最后一个元素的范围 迭代的对象要实现和的操作。
nullptr
由于在C中NULL是这样定义的 NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。 我们也可以测试下
//nullptr
void f(int)
{cout f:int endl;
}
void f(int*)
{cout f:int* endl;
}
int main()
{f(0);f(NULL);//结果一样因为NULL就是0}所以就有了nullptr这样的关键字 注意 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。