c 入门(一)
- 1.c 简介
- 2.c 关键字(c 98)
- 3.命名空间
-
- 3.1命名空间的定义
- 3.2命名空间的使用
- 4.c 输入&输出
- 5.缺省参数
-
- 5.1缺省参数分类
- 6.函数重载
-
- 6.1函数重载的概念
- 6.2.函数重载的使用
- 6.3c 支持函数重载的原理——名字修饰
c 是在c的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉c语言之后,对c 学习有一定的帮助,本章节主要目标:
- 补充c语言语法的不足,以及c 是如何对c语言设计不合理的地方进行优化的,比如:作用
域方面、io方面、函数方面、指针方面、宏方面等。 - 为后续类和对象学习打基础。
c 总计63个关键字,c语言32个关键字
刚入门,只需看看就好
可以看到上图中的代码报错了,可是为什么呢?
因为rand这个变量和stdlib.h这个库里的函数命名冲突了,c语言没办法解决类似这样的命名冲突问题,所以c 提出了namespace来解决。
3.1命名空间的定义
需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
同样也可以嵌套使用,但是如果同一个工程里存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,因此如果有相同的命名,依旧会报错,不过可以像上图一样使用嵌套命名空间。
3.2命名空间的使用
1.部分展开(使用using 命名空间名称::变量名)将命名空间中某个成员引入
2.指定命名空间访问(加命名空间名称及作用域限定符)
这里解释一下::符号,他是作用域限定符,如果左侧什么都没有,则默认去全局找变量
3.全局展开(using namespace 命名空间名称 引入)
总结:展开后就相等于还会去命名空间找,也可以理解为变成了全局变量
默认都是找局部变量、全局变量,就近原则,先局部变量。
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。 - cout和cin是全局的流对象,endl是特殊的c 符号,表示换行输出,他们都包含在包含<
iostream >头文件中。 - <<是流插入运算符,>>是流提取运算符。
- 使用c 输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
c 的输入输出可以自动识别变量类型。
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。
5.1缺省参数分类
1.全缺省参数
2.半缺省参数
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值必须是常量或者全局变量
- c语言不支持(编译器不支持)
6.1函数重载的概念
函数重载:是函数的一种特殊情况,c 允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
6.2.函数重载的使用
见上图,函数名都一样,但是没有报错,c则不行。
6.3c 支持函数重载的原理——名字修饰
每个编译器都有自己的函数名修饰规则。
由于windows下vs的修饰规则过于复杂,而linux下g 的修饰规则简单易懂,下面我们使
用了g 演示了这个修饰后的名字。
我们一开始先写了一个最基本的c源文件。(linux指令有相关问题的,可以看我的另一篇博客)
然后进行gcc编译,具体的指令就不解释了
我们可以看到c的函数名修饰规则就是原来的函数名,并没有变化,因此当你写了相同函数名的函数就会报错,因为编译器无法知道具体是哪个。
而使用c 的编译器g 后的的函数修饰后变成【_z 函数长度 函数名 类型首字母】。也就是说链接时合并段表时并不会发生冲突。
结论:在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。在linux下,采用g 编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。通过这里就理解了c语言没办法支持重载,因为同名函数没办法区分。而c 是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
另外还有一点要注意: 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。(我既可以接收返回值也可以不接收)。