当前位置: 首页 > news >正文

衡阳建设网站制作免费会员管理软件

衡阳建设网站制作,免费会员管理软件,永年哪做网站,成都手机wap网站制作C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点#xff1a; 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函… C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函数宏 ** C与C结合空指针NULL与nullptr的区别 可以看到C的基础部分需要掌握的知识多为零碎细小的知识更需要总结和整理。 C基础 常用关键字 C语言中有32个关键字而在C98中总共给出了63个关键字。所有的关键字如下所示 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassexternoperatorswitchvirtualregisterconstfalseprivatetemplatevoidtrueconst_castfloatprotectedthisvolatilewhiledeletegotoreinterpret_cast 我们在此总结一些比较常用的关键字。 using namespace 命名空间使用的目的是对标识符的名称进行本地化避免命名冲突或命名污染 定义命名空间 namespace MySpace {... };注意 命名空间可以嵌套。同一个工程可以存在多个相同名称的命名空间编译器最终会合并成同一个。定义一个命名空间就定义了一个新的作用域命名空间中的所有内容都局限于该作用域。 使用命名空间 使用命名空间有三种方法。 加命名空间名称及作用域限定符 // namespaceMySpaceint main() {printf(%d, MySpace::a); }使用using引入命名空间或者引入命名空间中的某个成员 using MySpace::a; //引入某个成员 using MySpace; //引入整个命名空间流插入和流提取操作符 流插入操作符流提取操作符std是C标准库的命名空间名如果使用标准库中的函数或者其他定义就需要使用命名空间std。使用cout标准输出对象和cin标准输入对象需要包含头文件并且要按照命名空间使用方法使用std。cout、cin是全局的流对象endl是特殊的c符号表示换行输出都包含在中。使用C的输入输出很方便不需要手动控制格式而是由操作符自动识别变量类型。流插入和流提取运算符在面对自定义类型时候都涉及运算符重载。 内联函数(inline) 内联函数是以inline 修饰的函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数可以提升程序运行的效率。 特性 inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用。缺点是可能会让目标文件变大优点是少了函数调用的开销提高了程序的运行效率。inline对于编译器而言只是建议就像register 一样不同编译器对inline实现机制可能不同。一般来说将函数规模小代码段短、不是递归且会频繁调用的函数采用inline修饰否则会忽略inline建议。inline不建议声明和定义分离分离会导致连接错误因为inline被展开就没有函数地址链接找不到。 宏 宏的优点增强代码的复用性、提高性能 宏的缺点不方便调试在预编译阶段进行了替换、代码可读性差、可维护性差、容易误用没有类型安全的检查。 C可以替换宏的技术 常量定义 换用const 或者 enum短小函数定义改用inline。 auto关键字 (c11 随着程序的复杂程度提高类型名也越来越复杂所以类型将会越来越难于拼写、含义不明确导致容易出错。 早期的auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但无人使用。 c11中auto有了全新定义auto作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译的时期推导得到。 auto使用 auto与指针和引用结合起来使用。 用auto声明指针类型时用auto和auto* 没有任何区别但用auto声明引用类型时必须加 可在同一行定义多个变量 但是在同一行声明多个变量时变量必须是相同类型否则编译器会报错因为编译器实际上只对第一个变量的类型进行推导并用推导出来的类型定义其他变量。 auto 也有不能使用的场景 auto不能作为函数的参数auto不能直接用来声明函数auto旧的含义被舍弃了。 auto最常见的用法就是和范围for或者lambda结合。 nullptr (c11 指针空值nullptr。 声明一个变量时最好给变量一个合适的初始值。我们在定义指针时如果它没有合法的指向我们一般会定义其为 int* p NULL; //cNULL实际上是一个宏定义如下 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void*)0) #endif #endif可以看到NULL可能被定义为字面常量0或者被定义为无类型指针的常量。但是这些都会遇到麻烦 void func(int) { cout func(int) endl; } void func(int*) { cout func(int*) endl; }int main() {func(0);func(NULL);func((int*)NULL);return 0; }程序的本意是用func(NULL) 调用指针版本的func(int*) 函数但是因为NULL 被定义成0所以调用了func(int) 版本。 在C98中字面常量0既可以是整型数字也可以是无类型指针void*常量但是编译器默认情况下看0作为一个整型常量所以如果要将其按照指针方式使用的话 必须强转(void)0. 这无异给我们的使用带来了困扰所以c11中添加了nullptr。 nullptr表示指针空值不用包含头文件因为其是作为C11新关键字引入的。C11中sizeof(nullptr) 与 sizeof((void*)0)占用的字节数相同。后续表示指针空值一律用nullptr。 缺省参数 缺省参数是定义或者声明函数时为函数的参数指定一个缺省值。如果在调用函数时没有给出对应的实参就采用该形参的缺省值否则使用指定的实参。 void func(int a 10) {cout a endl; } int main() {func(1); //传了用自己传的func(); //没传用缺省的return 0; }缺省函数分类 全缺省函数 函数的所有参数都有缺省值意味着在调用函数的时候可以不给任何实参。上面的func就是一个例子。 半缺省函数 void func(int a, int b 10, int c 20){cout a a endl;... }上述就是半缺省函数代表着在调用函数的时候可以不给出部分参数的值。有注意事项 半缺省参数必须从右往左依次给出不能间隔。缺省参数不能在函数的声明和定义中同时出现。缺省值必须是常量或者全局变量。C语言不支持缺省函数。 函数重载 函数重载是函数的一种特殊情况C允许在同一个作用域下声明功能类似的同名函数同名函数的形参列表包括参数个数或者类型或者类型顺序不同常常用做处理实现功能类似数据类似的不同问题。接下来我们分开举例。 参数类型不同 //打算实现int类型和double类型的Add函数 int Add(int a, int b) {return a b; } double Add(double a, double b) {return a b; }上述两个函数参数的类型不同但是函数名相同这就构成了函数重载。 参数个数不同 void f() { cout void f() endl;} void f(int a) { cout void f(int a) endl; }这就是参数个数不同而函数名相同构成的重载如果我们调用f时不给任何参数就会调用上面的无参版本如果调用f时任给一个int 值就会调用下面的带int 版本。 参数类型顺序不同 void f(char ch, int a) {cout void f(char ch, int a) endl; } void f(int a, char ch) {cout void f(int a, char ch) endl; }参数的类型顺序如果稍有不同也可以构成重载。 C不支持函数重载而C支持其原因就是C支持函数重载的原理是 名字修饰 (name mangling) C/C中程序的运行需要经过几个步骤预处理、编译、汇编、链接。 举个例子现在有a.cc 、b.cc两个文件在 b.cc中定义了Add函数而在 a.cc中使用了Add函数。 编译后链接之前a.o 的目标文件中没有Add的函数地址因为Add是在b.cc中定义的所以Add的地址在b.o 中。 在链接时链接器看到a.o 调用Add但是没有Add的地址就会到b.o 的符号表中找Add的地址然后链接到一起。 链接时面对Add函数链接器会使用一个名字去找。每个编译器的函数名修饰规则不同gcc的函数名修饰过后不变意味着不能同时出现两个同名函数g函数名修饰过后变成了 _z 函数长度 函数名 类型首字母编译器将函数参数类型信息都添加到修改后的名字中。 正因如此C语言无法支持函数重载因为同名函数无法区分而C时通过函数修饰规则来区分只要参数不同参数类型参数个数参数类型顺序修饰出来的名字就不同所以支持重载。 如果两个函数的函数名和参数相同而返回值不同不构成重载因为调用时编译器无法区分二者。编译器区分规则是_z 函数长度 函数名 类型首字母。 引用 引用不是新定义一个变量而是给已经存在的变量取别名。变量和它的引用共用同一块内存空间。 引用特性 引用在定义时必须初始化。 一个变量可以有多个引用。 引用一旦有了实体就不能引用其他实体。 常引用: const 类型的对象需要用常引用即const 类型 别名 实体。 const int a 10; int ra a; //编译时报错因为a 是常量如果不加const可能会修改。 const int ra a; //正确写法float b 3.14; double rb b; //错误类型变了。 const double rb b; //可以表示别名rb不能修改b的值。使用场景 做参数 void Swap(int a, int b) {int temp a;a b;b temp; }只有当a 和b 是引用时才奏效就跟我们当时C语言传指针一样。 做返回值 int Count() {static int n 0;n;return n; }这里的n 是static静态的所以可以用传引用返回因为出了函数的作用域n还存在。如果我们定义一个普通的对象如下 int count() {int n 0;n ;return n; }可以发现出了函数的作用域返回的对象已经销毁了这时候必须使用传值返回。 传值和传引用的区别 传值传参或者传值返回函数不会直接传递参数或者将变量直接返回而是传递这个参数或者返回值的临时拷贝因此这样效率非常低尤其是当参数或者返回值类型大的时候效率更低。 引用和指针的区别 语法概念上引用就是别名没有独立空间和引用实体共用一块空间。底层实现上实际上是由空间的因为引用是按照指针方式实现的。 引用概念上定义一个变量的别名而指针存储一个变量的地址。引用在定义时必须初始化指针没有要求。引用在初始化引用一个实体之后不能引用其他实体指针可以在任意时刻指向同类型实体。没有NULL引用但是有NULL指针。在sizeof中含义不同sizeof引用结果是引用类型的大小指针始终是地址空间所占的字节。引用是引用实体指针是指针向后偏移一个类型的大小。有多级指针没多级引用。访问实体的方式不同指针需要自己显式解引用引用则是编译器自己处理。引用比指针使用相对更安全。 以上就是C入门时需要知道的基础知识。
http://www.w-s-a.com/news/651858/

相关文章:

  • 制作网页前为什么要建立站点菏泽百度网站建设
  • 做影视网站引流网页美工设计课程教案
  • 响应式网站开发流程图网站优化seo教程
  • 做汽车团购网站百度官网平台
  • 网站增加关键字建设旅游网站的功能定位
  • 怎么搭建源码网站义乌网络
  • 定远规划建设局网站wordpress云主机安装
  • 慈溪市网站开发软件开发文档国家标准
  • 本地佛山顺德网站设计公司的网站如何建设
  • 网站建设前十名网站建设 招标书
  • 手机网站标准百度搜索关键词排名优化推广
  • 中国空间站科幻作文1000字wordpress运行库
  • 徐州做网站的wordpress可视化编辑器排行
  • 官方网站英语上海公司注册核名查询
  • 东莞网站建设推广云南昆明最新消息
  • 上网站乱码网页设计与网站建设案例教程
  • 宣讲网站建设wordpress多媒体主题
  • 如何成立网站互联网开发是做什么的
  • 网站首页的尺寸做多大网页图片排版
  • 龙岩天宫山索道多少钱河南网站排名优化哪家好
  • 北京做网站设计程序员和网站开发
  • 个人 做自媒体 建网站图片制作成视频的手机软件
  • h5 建站网站 移动端重庆潼南网站建设价格
  • 商企在线营销型网站怎么做时光网站
  • 网站建设方案论文1500竞价托管哪家便宜
  • 使用cdn的网站宣武网站建设
  • 营销型网站怎么建设企业网站Wap在线生成
  • 网站建设服务费应该做到什么科目广州网页制作服务商
  • 网站显示500错误怎么解决方法店面设计模板
  • 网站备案icp文化传媒有限公司