烟台百度建网站,国内5大搜索引擎,好建设网站,室内设计软件培训目录
前言
C关键字
命名空间
1.命名空间的定义
A.标准命名空间定义
B.命名空间允许嵌套定义
C.同名命名空间的合并 2.命名空间的使用
加命名空间名称及作用限定符
使用using将命名空间中某个成员引入
使用using namespace命名空间名称引入
C的输入和输出
缺省参数…目录
前言
C关键字
命名空间
1.命名空间的定义
A.标准命名空间定义
B.命名空间允许嵌套定义
C.同名命名空间的合并 2.命名空间的使用
加命名空间名称及作用限定符
使用using将命名空间中某个成员引入
使用using namespace命名空间名称引入
C的输入和输出
缺省参数
缺省参数的概念
缺省参数的分类和使用
结语 前言
本篇博客就是C的开篇了C是在C的基础之上容纳进去了面向对象编程思想并增加了许多有用的库以及编程范式等。熟悉C语言之后对C学习有一定的帮助。很多人考虑到关于语言选择的问题不知道学完C后该去学什么语言。这里我想说的就是主流语言基本上是互通的当你学精一门以后再上手其他的语言也会非常快。如果你要问C难不难我只能说学起来不简单。但C其难学易用相信在正真学懂之后你一定会爱上这门语言的。
入门篇的博客主要是补充C语法的不足以及C是如何对C语言设计不合理的地方进行优化的比如作用域方面、IO方面、函数方面、指针方面、宏方面等。同时也要为后面类和对象的学习打基础。
C关键字
C共计63个关键字C语言只有32个关键字可以给大家预览一下
asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassexternoperatorswitchvirtualregisterconstfalseprivatetemplatevoidtrueconst_castfloatprotectedthisvolatilewhiledeletegotoreinterpret_cast
命名空间
在C/C代码编写的过程中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题而想出的解决方式。
#include stdio.h
#include stdlib.h
int rand 10;
int main()
{printf(%d\n, rand);return 0;
}
上面这段代码会这样报错原因是rand在头文件stdlib.h中已经被定义为一个函数再次定义rand为变量会出现名称冲突C语言没办法解决类似这样的命名冲突问题所以C提出了namespace来解决。 在将rand放入命名空间xsr中后运行此段代码会生成一段随机数因为此时并未指定命名空间的rand所以打印的依然是在头文件stdlib.h中定义的rand()函数地址。 我们只需要指定域就可以达到打印域中rand的效果
int main()
{printf(%d\n, xsr::rand);return 0;
} 接下来我们就来讲讲关于命名空间使用的定义和几种使用方法。
1.命名空间的定义
定义命名空间就需要使用到namespace关键字后面跟命名空间的名字然后接一对{ }即可{ }中即为命名空间的成员。
A.标准命名空间定义
namespace xsr
{// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}struct Node{struct Node* next;int val;};
}
定义一个命名空间相当于定义了一个新的作用域命名空间中的所有内容都局限于该命名空间中。
B.命名空间允许嵌套定义
namespace N1
{int a;int b;int Add(int left, int right){return left right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}
这个时候N2就是N1里面定义的一个命名空间可以通过N1间接访问命名空间N2。
C.同名命名空间的合并
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成为同一个命名空间。
//test.cpp
namespace N1
{int a;int b;int Add(int left, int right){return left right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}// test.h
namespace N1
{int Mul(int left, int right){return left * right;}
}
一个工程中的test.h和上面test.cpp中两个N1会被合并成一个这就是相同名称命名空间的合并在同一个文件中的两个同名的命名空间也会如此。 注一个命名空间就定义了一个新的作用域命名空间中的所有内容都局限于该命名空间中 2.命名空间的使用
既然学会了定义命名空间那么如何使用命名空间中的内容呢
我们以这一段代码为例
#includestdio.h
namespace xsr
{int a 1;int b 2;int Add(int left, int right){return left right;}struct Node{struct Node* next;int val;};
}
int main()
{printf(%d\n, a);printf(%d\n, b);struct Node newnode;printf(%d\n, Add(a, b));return 0;
}
这时会这样报错 加命名空间名称及作用限定符 使用第一种方式加命名空间名称做限定符就需要这样改
int main()
{printf(%d\n, xsr::a);printf(%d\n, xsr::b);struct xsr::Node newnode;printf(%d\n, xsr::Add(xsr::a, xsr::b));return 0;
}
这时候代码就可以成功跑起来了这里注意一点域名在指定结构体时是加在结构体名称前struct关键字后的。 但是如果要反复使用其中的某个变量和函数每次都加上域名的指定一定不会好受下面介绍两种展开方式来解决此类问题。
使用using将命名空间中某个成员引入
我们使用using将命名空间中某个成员引入如果你想用这样的方式展开函数和结构体也可以方法都是类似的。
using xsr::a;
using xsr::b;
using xsr::Node;
using xsr::Add;
int main()
{printf(%d\n, a);printf(%d\n, b);struct Node newnode;printf(%d\n, Add(a, b));return 0;
}
这时候就可以访问到域中的内容了。 使用using namespace命名空间名称引入
using namespace xsr;
int main()
{printf(%d\n, a);printf(%d\n, b);struct Node newnode;printf(%d\n, Add(a, b));return 0;
}
这时的展开你可以直接去访问域中定义好的结构体就像在全局变量中定义的那样。 当你没有展开命名空间时编译器默认的规则是先去局部域找找不到再去全局域中去找这个时候域中是不会纳入查找范围的。 当展开命名空间后编译器的默认查找规则为 先去当前域找再去全局域中找最后再去展开的命名空间去找 注如果两个或两个以上展开的命名空间中有同名变量编译器同样会报错。 想问问你之前是否见过别写C开头经常有这样一段代码
#includeiostream
using namespace std;
其实using namespace std; 的本质就是展开头文件iostream中定义的一个命名空间这个命名空间的名字就叫做std。 关于命名空间的使用总结为 指定命名空间访问部分展开using xsr::a;全局展开using namespace std;大型项目中不推荐容易产生冲突 C的输入和输出
C作为以C为的基础发展而来的一门语言也有其自己独特的输入输出方式跟初学C语言学printf和scanf时一样C中使用输入输出流来实现打印和接收信息。
#includeiostream
using namespace std;
int main()
{cout Hello C endl;return 0;
}
std是C标准库的命名空间名C将标准库的定义实现都放到这个命名空间中。 说明 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件以及按命名空间使用方法使用std。cout和cin是全局的流对象endl是特殊的C符号表示换行输出等同于C语言中的\n他们都包含在包含iostream 头文件中.是流插入运算符是流提取运算符。使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。C的输入输出可以自动识别变量类型。实际上cout和cin分别是ostream和istream类型的对象和也涉及运算符重载等知识这些知识我们我们后续才会学习所以我们这里只是简单学习他们的使用。 注早期的标准库将所有功能在全局域中实现声明在.h后缀的头文件中使用时只需包含对应头文件即可后来将其实现在std命名空间下为了和C头文件区分也为了正确使用命名空间规定C头文件不带.h旧编译器(vc 6.0)中还支持iostream.h格式后续编译器已不支持因此推荐使用iostreamstd的方式。 下面是关于cin和cout的简单使用
#include iostream
using namespace std;
int main()
{int a;double b;char c;// cin和cout可以自动识别变量的类型cin a;cin b c;cout a endl;cout b c endl;return 0;
} cout和cin还有很多更复杂的用法比如控制浮点数输出精度控制整形输出进制格式等等。因为C兼容C语言的用法我们可以用C来穿插控制输入输出同时这些又用得不是很多我们这里就不展开学习了。后续遇到需要特别学习的再展开论述。
std命名空间的使用建议
在日常练习中可以用using namespace std直接展开即可比较方便。但是使用1方式直接展开相当于吧标准库完全暴露了出来如果我们跟库进行了重定义类型/对象/函数就很容易出现冲突。平时练习时一般很少出现这种情况但正真项目开发的代码较多规模大就很容易出现。所以建议在项目开发中使用像std::cout这样使用时指定命名空间 和 using std::cout展开常用的库对象/类型等方式。
缺省参数
缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实 参则采用该形参的缺省值否则使用指定的实参。
#includeiostream
using namespace std;
void Fun(int a 0)
{cout a endl;
}
int main()
{Fun();// 没有传参时使用参数的默认值Fun(5);// 传参时使用指定的实参return 0;
} 缺省参数的分类和使用
1.全缺省参数
void Func(int a 10, int b 20, int c 30)
{couta aendl;coutb bendl;coutc cendl;
}
2.半缺省参数
void Func(int a, int b 10, int c 20)
{couta aendl; coutb bendl;coutc cendl;
} 注 半缺省参数必须从右往左依次来给出不能间隔着给给函数缺省参数传参时也只能从左往右依次传不能间隔着传缺省参数不能在函数声明和定义中同时出现如果同时有声明和定义需要将缺省值放在声明中此时给定义放缺省值会报错缺省值必须是常量或者全局变量C语言不支持C语言的编译器不支持缺省参数 #includeiostream
using namespace std;
void Fun(int a 10, int b 20, int c 30)
{cout a b c endl;
}
int main()
{Fun(1, 2, 3);Fun(1, 2);Fun(1);Fun();// 使用缺省参数传参时必须严格从左往右依次传参// 以下皆为错误写法// Fun( , ,3);// Fun( ,2, );return 0;
} 结语
本篇博客是C语法的第一课是C对C语言不足之处的一些补充讲了关于C解决命名冲突命名空间的定义和使用C的基本输入输出流和缺省参数等内容。
关于C入门还需要一篇博客的量才能基本讲解完毕感谢大家的支持。