网站开发负责人是什么职位,wordpress注册的用户不是vip,卫计局本年度网站建设工作总结,网页制作怎么做链接前言#xff1a;
本篇将结束c的一些基础的语法#xff0c;方便在以后的博客中出现#xff0c;后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍#xff1b;其次#xff0c;我们需要知道c是建立在c的基础上的#xff0c;所以c的大部分语法都能用在c上。 目…
前言
本篇将结束c的一些基础的语法方便在以后的博客中出现后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍其次我们需要知道c是建立在c的基础上的所以c的大部分语法都能用在c上。 目录
1.域作用限定符
2.关键字namespace
3.流插入和流提取
4.缺省默认参数与缺省值
a.全缺省参数
b.半缺省参数
c.注意
5.函数重载
6.指针和引用
a.语法
b.应用
c.常引用
d.指针和引用的区别
7.内联函数inline
a.复习宏
b.使用
c.内联函数的性质
8.关键字auto
a.语法
b.缺点
c.特性
d.typedef的缺点附加
9.范围forc11
10.关键字nullptr
总结
只介绍了c中一些常见的基础语法精进需要结合后面的内容毕竟只学习语法却不了解应用是学不好的本文如有错误请指正并会及时回复。 1.域作用限定符
首先认识一下域作用限定符
#include iostreamint main()
{
std::couthello worldstd::endl;
return 0;}
代码中域作用限定符就是::当我们遇到在用一个项目组中使用了相同的命名的时候除了改该怎么办我们可以指定对应的域中去找相应的重复命名的内容例如去某个结构体或者类中去找类在后面会介绍其次记住一点如果域作用限定符的左侧为空就是去全局里面去找。 2.关键字namespace
#include iostream
using namespace std;
int main()
{couthello worldendl;return 0;
}
首先可以明显的看到函数里面的内容少了点什么这就是因为我们加上了一句using namespace std为什么呢
这里就开始介绍初学c为什么要这样写程序了因为大部分人学会使用了c却连开始为什么要这样写都说不上一二就有些尴尬了首先介绍开始的头文件
我们查阅文档可知来源https://legacy.cplusplus.com/reference/iostream中包含了cin和cout等其实它们都是iostream的对象所以我们要想使用cout和cin等就要包含这个头文件。
那cout和cin等又是什么我们目前记住它们是用来显示屏幕的信息和提取屏幕的信息的分别需要搭配流插入和流提取所以它们就都相当于c中的printf和scanf但是不同的是它们不是库函数而是某个类的对象后面再提以及与printfscanf的区别也在后面再提。
然后endl只需要知道它是换行的意思即可。
然后就是我们的命名空间这一行这一行是什么意思呢首先我们需要知道
用法namespace name
{}
命名空间---命名空间域只影响使用不影响生命周期在多个文件使用相同的命名空间会被认为是同一个
然后我们需要知道std是c标准库的名字也就是说如果我们想用封装在c标准库中的内容就需要展开这个命名空间也就是展开标准库所在的域这样才能使用库中的内容如果不这样使用cout等就会不被编译器所认识。
但是需要注意你会在一些人的代码中发现是这样写的
std::couthello worldstd::endl
为什么呢首先我们知道了命名空间的存在其实就是为了封装起你写的内容避免其他的重复命名出现导致出问题而如果要让标准库中的域展开那就破坏了这道防线因为其实封装的目的就是防止你的命名与标准库中的冲突再使用与标准库中同名的就不行了所以就有了这样的写法平时练习可以直接展开但比较大的项目中不建议这样用。
如果我们将上方的写法称为全部展开那下面的写法就为部分展开
using std::cout;
using std::endl;
也就是让比较常用的展开避免一个一个写。 3.流插入和流提取
刚刚我们已经提到了它们例如coutendl就是让换行符流到控制台上再看一个流提取的例子
int n0;
double* a(double*)malloc(sizeof(double));
if(aNULL)
{perror(malloc fail);exit(-1);
}
for(int i0;in;i)
{cina[i];
}
for(int i0;in;i)
{couta[i]endl;
} 这是一个输入数组元素然后打印出来的例子从中我们可以看到cout和cin的用法但是我们也可以发现我们在使用cout和cin的时候好像不用管a是一个double类型的数组唉
这就是流的特性
流会自动识别类型,不需要%d%f等输入输出
至于为什么我们将在流的内容与运算符重载中在提。 4.缺省默认参数与缺省值
我们知道在c语言中函数的参数是不能赋值的也就是说你传来的什么就是什么而c有创造了一个新的玩法 void func(int a0){coutaendl;}int main(){func(1;//传参就是打印传的值也就是1func();//不传就是打印默认值0return 0;}至于有什么用我们在以后再说减少重载函数的数量简化函数的调用过程。
a.全缺省参数
全缺省就是所以参数都缺省
void Func(int a 10, int b 20, int c 30)
{cout a a endl;cout a b endl;cout a c endl;cout endl;
}int main()
{Func(1, 2, 3);return 0;
}
需要注意的是只能从右往左缺省且要连续为什么呢
因为如果你要写成
void Func(int a 10, int b 20, int c )那你传两个参数的时候c对应的位置必须要有一个传过来的参数因为没缺省嘛那第一个实参是对应的a还是b不仅编译器会报错意义也不明参数从右往左缺省就不会出现这样的问题。
然后就是使用缺省值要从右往左(因为参数是从右往左缺省的)连续使用像这样不连续的就不行
Func(,1,2); b.半缺省参数
也就是参数可以不完全缺省规则也和全缺省一样从右往左连续缺省不同的是不能不传参数如果传一个参数就是对应最左边的参数
c.注意
不能在声明和定义中同时给缺省参数要在声明中给如果声明和定义的缺省值不同编译器无法确定放在声明中也减少了其他源文件重复定义还有些人说是为了保护代码的安全因为别人copy了源码却不知道缺省值缺省值必须是常量或者是全局变量c语言不支持缺省参数 5.函数重载
在c中我们知道使用函数名相同的函数是行不通的所以本贾尼博士又发明了一个新的语法允许函数名可以相同但是参数的个数或者返回类型或者类型的顺序要不同的同名函数存在。
void Add(int a,int b);
void Add(int a,int b,int c);void Add(int a,int b);
void Add(double a,double b);void Add(int a,int b);
void Add(int b,int a);
那具体是怎么实现相同的函数名能找到对应的函数呢 c对函数名进行了修饰此为linux的修饰规则不同平台的修饰规则不同例如void Addint aint b会修饰成_Z3Addii,void Add(double a,double b)会修饰成_Z3Adddd,其中_Z是固定的3是函数名长度再加上函数名再加上形参的类型缩写通过不同的函数名修饰加上编译时产生的地址就能区别出调用哪个了浮点数默认为double 另外还需要注意
返回值不同的其他都相同不构成重载因为编译器识别不出来不是因为修饰名没有返回值而识别不出而是调用函数的时候没写返回值call这个函数的地址的时候没有返回值区分不出来
编译时就已经确定了调用那个函数 编译速度可能变慢但是运行速度不会变慢 6.指针和引用
a.语法 可以看到k是i的引用并且地址是一样的所以我们又说k是i的别名。
同时我们还可以看到直接赋值地址是不一样的因为是又开辟了新的栈帧。
引用在后面的应用有很大的作用。 注意 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体再不能引用其他实体 b.应用
应用1输出型参数---实参影响形参的情况例如改变实参的值就要传实参的地址从而形参要用指针 void Swapint xint y//形参是实参的别名地址一样不用取地址{int tmpxxyytmp}应用2做返回值
首先先引入传值返回 我们可以看到:
返回的n先存到(拷贝给)一个临时变量可能是寄存器也可能是上一层栈帧然后count栈帧销毁这个临时变量再给给ret如果n是个静态的变量放在静态区也是先存到临时变量也不会直接返回n此为传值返回用于变量出了作用域就不在的情况 如果使用传引用返回 返回n的别名减少了拷贝因为n已经是静态的了但返回时还要拷贝到一个临时变量返回n的别名就减少了拷贝可以理解产生了一个临时变量但这个临时变量是n的别名也就是n就减少了拷贝 只要出了count作用域这个变量还在就可以用传引用返回 所以使用传引用返回我们可以得到以下结论 减少拷贝调用者可以直接修改返回的对象 我们再来看一个错误的例子
int Add(int aint b)
{int cab;return c;
}int main()
{int retAdd(1,2);//正确的int retAdd(1,2);//错误的
}
返回c的别名ret又是c这块空间的别名但是c这块空间销毁了访问ret也是找到销毁的空间如果c的空间被覆盖就是随机值没有就还是那块空间 总结
如果函数返回时出了函数作用域如果返回对象还在还没还给系统则可以使用引用返回性能上有一定的提升如果已经还给系统了则必须使用传值返回以此理解全局变量二者都可以因为全局变量也是存在静态区的所以也是先拷贝给临时变量。 c.常引用 const int c2;const int dc;const int* p1NULL;const int* p2p1;const int m1;int nm;int count{int n1;return n;}const int retcount();int i0;const double rdi;
从前两个例子我们可以知道d是c的别名c是不可改的那d也应该是不可改的同理指针也是*p不能修改但是p可以修改需要根据const的位置在c专栏中有介绍到这一点
赋值或初始化权限可以缩小只有别名是const修饰但是不能放大。
而第三个例子就仅仅赋值所以n的改变不会影响到m。
第四个例子是count的返回值是n先拷贝给临时变量再给ret返回的这个临时变量在此过程中也不可改变它的别名也要用const修饰。
第五个例子是隐式类型转换类型转换会产生临时变量i先给给double类型的临时变量临时变量再给给rd所以rd是这个临时变量的别名而这个临时变量因为在这个过程里面这个临时变量肯定不变嘛具有常性所以要加const。 d.指针和引用的区别
首先我们需要知道
从语法的角度引用不开空间指针需要开空间而从底层的角度从汇编来看二者过程一模一样引用也是需要开空间的
其次不同点 这里的安全是从引用没有空引用个定义必须初始化出发的因为有时指针的一些错误不会直接报错。 7.内联函数inline
a.复习宏
c推荐使用enum和const代替宏常量inline代替宏函数。
我们来复习一下宏的优缺点 优点 类型可以不固定不用建立栈帧 缺点 不能调试 没有类型安全的检查 有些场景非常复杂例如add宏函数 #define ADDxyxy 1.为什么xy要加括号因为宏只是替换例如ADD1,2*3不加括号就达不到效果了 2.为什么里面的x和y分别要加括号因为例如ADDa|b,ab;宏会替换成a|bab而加号 优先级更高也达不到想要的效果 3.加分号也不行ADD1,2*3宏会替换成12*3会报错 b.使用 inline int Addint xint y{int zxyreturn z}用汇编查看可知在调用内联函数时就展开了函数的逻辑不用建立栈帧
如果存在call Add就是没有展开函数也就不是内联红色箭头指向的就是没有call 这个函数的地址直接展开函数体使用了内联。 c.内联函数的性质 关于第三点 假设在头文件中声明一个内联函数再在函数实现文件中定义一个内联函数此时在主函数中使用内联函数就会链接报错因为虽然主函数引用了头文件但是内联函数是直接展开的没有地址头文件只定义了内联函数但找不到内联函数的地址也就是出现在了声明中但是展开时找不到函数体所以建议定义和声明都在头文件里。 注意 如果成员函数在类中定义编译器可能会将它当做内联函数处理。 所以在stl源码里面有些短小的函数直接就放在类里面定义了就是当做了内联函数 有些大一点的函数就类中声明类外定义源码就这样搞的所以声明定义分离还是有一定的道理的。 8.关键字auto
a.语法
int a0;
auto ba;
auto ca;couttypeid(b).nameendl;//int
couttypeid(c).nameendl;//int*
实际价值是为了简化类型很长的代码。 b.缺点 不能做形参不能声明数组定义变量必须初始化 c.特性 auto后加*或者就是限定类型为指针或者是引用 auto a1,b2;
auto c1,b2.0;//报错 同一行定义多个变量时这些变量必须是相同的类型否则编译器会报错因为编译器是根据第一个类型进行推导再用推导出来的类型定义其他的。 d.typedef的缺点附加
typedef char* pstring;
int main()
{const pstring p1;//报错需要初始化const pstring* p2;//正确
} 这里所说的缺点就是如果是const char* p1就不会报错因为const修饰的是p1指向的空间可以不对p1赋初始值但是使用typedef就不行了这里会被误解为const char p1,const修饰的是p1要对p1赋初始值。 9.范围forc11 int array[]{0123};forauto earray//自动依次数组中的数据赋值给e对象自动判断结束所以e的改{coute ; //变不会改变数组的值想改数组值用auto e}coutendl;c11提供的语法糖底层其实是迭代器知道怎么使用就行分号前是范围内用于迭代的变量右边是被迭代的范围 这里auto加上了引用是因为数据量大且涉及深拷贝以后还会介绍。 10.关键字nullptr
c里NULLNULL是一个宏被定义为0识别出来是int实际c不定义应该是void*0 总结
只介绍了c中一些常见的基础语法精进需要结合后面的内容毕竟只学习语法却不了解应用是学不好的本文如有错误请指正并会及时回复。
文章转载自: http://www.morning.klzdy.cn.gov.cn.klzdy.cn http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn http://www.morning.fylsz.cn.gov.cn.fylsz.cn http://www.morning.dtrcl.cn.gov.cn.dtrcl.cn http://www.morning.cgstn.cn.gov.cn.cgstn.cn http://www.morning.youprogrammer.cn.gov.cn.youprogrammer.cn http://www.morning.mxmzl.cn.gov.cn.mxmzl.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.lhhdy.cn.gov.cn.lhhdy.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.xwrhk.cn.gov.cn.xwrhk.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn http://www.morning.zlnyk.cn.gov.cn.zlnyk.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.wrtxk.cn.gov.cn.wrtxk.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn http://www.morning.wyzby.cn.gov.cn.wyzby.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.jgnjl.cn.gov.cn.jgnjl.cn http://www.morning.mqldj.cn.gov.cn.mqldj.cn http://www.morning.bncrx.cn.gov.cn.bncrx.cn http://www.morning.dmsxd.cn.gov.cn.dmsxd.cn http://www.morning.rynq.cn.gov.cn.rynq.cn http://www.morning.znkls.cn.gov.cn.znkls.cn http://www.morning.ydxwj.cn.gov.cn.ydxwj.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.mmynk.cn.gov.cn.mmynk.cn http://www.morning.rrpsw.cn.gov.cn.rrpsw.cn http://www.morning.rhmk.cn.gov.cn.rhmk.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.fwmln.cn.gov.cn.fwmln.cn http://www.morning.bsrcr.cn.gov.cn.bsrcr.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.njpny.cn.gov.cn.njpny.cn http://www.morning.dpsyr.cn.gov.cn.dpsyr.cn http://www.morning.wqkfm.cn.gov.cn.wqkfm.cn http://www.morning.kgtyj.cn.gov.cn.kgtyj.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.qyglt.cn.gov.cn.qyglt.cn http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn http://www.morning.jrrqs.cn.gov.cn.jrrqs.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.kclkb.cn.gov.cn.kclkb.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.ykmtz.cn.gov.cn.ykmtz.cn http://www.morning.kwwkm.cn.gov.cn.kwwkm.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.dpflt.cn.gov.cn.dpflt.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.prxqd.cn.gov.cn.prxqd.cn http://www.morning.rjyd.cn.gov.cn.rjyd.cn http://www.morning.rbrd.cn.gov.cn.rbrd.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.mlnbd.cn.gov.cn.mlnbd.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.lzbut.cn.gov.cn.lzbut.cn http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn http://www.morning.mrfgy.cn.gov.cn.mrfgy.cn http://www.morning.pphbn.cn.gov.cn.pphbn.cn http://www.morning.rhfh.cn.gov.cn.rhfh.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.npmcf.cn.gov.cn.npmcf.cn http://www.morning.sryhp.cn.gov.cn.sryhp.cn http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.bfhrj.cn.gov.cn.bfhrj.cn http://www.morning.hmqjj.cn.gov.cn.hmqjj.cn http://www.morning.3ox8hs.cn.gov.cn.3ox8hs.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.gthwr.cn.gov.cn.gthwr.cn