nofollow标签对网站收录的影响,哪些网站需要icp备案,自己怎么做云购网站吗,彭州建设网站文章目录 C语言与C命名空间命名空间的定义和使用 C的输入输出缺省参数函数重载引用赋值与引用引用在参数上的使用以及注意事项函数返回值的引用引用与值的时间效率比较常引用 C语言与C
很多初学者都会把这两门语言进行混淆#xff0c;但其实这是两种不同的语言#xff0c;C相… 文章目录 C语言与C命名空间命名空间的定义和使用 C的输入输出缺省参数函数重载引用赋值与引用引用在参数上的使用以及注意事项函数返回值的引用引用与值的时间效率比较常引用 C语言与C
很多初学者都会把这两门语言进行混淆但其实这是两种不同的语言C相对与C语言高级了一些 语法差异 C语言是一种面向过程的编程语言它主要注重函数的调用和流程控制。语法比较简洁代码结构更加直观。 C语言是一种混合型的编程语言即支持面向过程的编程方式还支持面向对象的编程方式。相对于C语言C主要引入了类、对象、继承、多态等概念。 标准库 C语言的标准库提供了基本的操作函数和常用的数据结构、如数组、字符串的处理、文件操作等。 C语言是C语言标准库的拓展提供丰富的容器vector、list等和算法排序、查找等以及输入输出流等功能。 内存管理 C语言中需要手动管理内存分配和释放使用malloc、free等函数进行动态内存的管理。 C语言引入了析构函数和构造函数通过new和delete关键字自动管理内存分配和释放减少了内存泄漏和错误释放的风险。 在C中可以完全兼容C语言可以直接调用C语言编写的库函数和代码。
命名空间
在C/C中变量、函数和类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的
在C语言中
#includestdio.h
int printf 5;
int main()
{printf(%d, printf);return 0;
}这种做法是错误的printf是一个打印到屏幕的函数由于你对变量的命名与函数名一致就会导致编辑器认为printf就是创建的临时变量printf函数也就无法使用。
命名空间的定义和使用 命名空间关键字为namespace它是将全局作用域进行划分规定出自己的区域这样同名者就不会进行冲突了。就像你们村有个叫张三的隔壁村也有个叫张三的只要你说我们村的张三的那么就知道你要找哪个张三了。 定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。
namespace sea
{int printf 10;int Add(int left, int right){return left right;}struct Node{struct Node* next;int val;};
}这样就规定了上面使用的结构体printfAdd就在sea命名空间内了。
命名空间也是可以嵌套使用的就像一个大的村子里面还有很多个小村
namespace sea1
{int a;int b;int Add(int left, int right){return left right;}namespace sea2//嵌套{int c;int d;int Sub(int left, int right){return left - right;}}
}对于同样的命名编辑器会自动规划在同一片区域
namespace sea1
{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;}}
}
namespace sea1
{int a 10;int c;
}将命名空间进行调用发现两个创建的变量和函数都放到一起所以可以看出同样的命名空间会自动划分为同样一块区域 而像a这样的会报错出现重定义 对于命名空间的使用有三种方式 第一种就是上面的方式
int main()
{//::表示作用域限定符::对作用域内的函数、变量等进行调用printf(%d\n,sea1::a);
}第二种使用using将命名空间中某个成员引入
using sea1::b;
int main()
{printf(%d\n, sea1::a);printf(%d\n, b);return 0;
}第三种使用using namespace 命名空间名称 引入
using namespce sea1;
int main()
{printf(%d\n, N::a);printf(%d\n, b);Add(10, 20);return 0;
}C的输入输出
对于C来说输入输出不只是可以用printf和scanf
#include iostream
using namespace std;
int main()
{//直接输出couthelloendl;//类型不同int a 10;cout a endl;float b 3.33;cout b endl;//输入cin a;cout a endl;return 0;
}使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件 以及按命名空间使用方法使用std。 2. cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。 3. 是流插入运算符是流提取运算符。使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。 C的输入输出可以自动识别变量类型。 具体介绍后面章节会说这里我们只要记住cout类似于printf一样 cin类似于scanf
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。
void f(int a10, int b15, int c20)
{cout a endl;cout b endl;cout c endl;}
int main()
{//缺省参数f();
}输出10 15 20 像这种形参中都用成缺省参数称之为全缺省参数 f(1, 2, 3);//全缺省参数可以全部传参f(1, 2);f(1);以上这种都可以进行实现 1 2 3 1 2 20 1 15 20 对于引用缺省参数的函数来说在进行函数调用传参时默认从左到右进行传参像上面f(1)一样默认就是第一个传参了其他的都用了缺省参数的调用值 如果函数成这样
void f(int a, int b, int c20)
{cout a endl;cout b endl;cout c endl;}称之为半缺省参数 会发现下面两个函数调用都是错误的因为那些没有使用缺省参数的你不传参表示没有值传参
这里要注意半缺省参数必须从右往左给因为函数传参时默认是从左到右依次传参。
缺省参数不能在函数声明和定义中同时出现否则将会报错 真要选其中一个进行定义应该在声明中进行缺省参数。
缺省值必须是常量或者全局变量
函数重载
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。
int f(int a,float b)
{cout a endl;cout b endl;return 0;
}
void f(float a)
{cout a endl;//cout b endl;
}int main()
{f(1,2.2);f(2.2);
}
这种为函数参数个数不同
int f(int a,float b)
{cout a endl;cout b endl;return 0;
}
void f(float a ,int b)
{cout a endl;cout b endl;
}int main()
{f(1,2.2);f(2.2,1);
}这种是函数参数位置不同 void f(int a,int b)
{cout a endl;cout b endl;}
void f(double a ,double b)
{cout a endl;cout b endl;}int main()
{f(1,2);f(2.2,1.1);
}这种为参数类型不同 而这里如果把double改为float的话会进行报错这是因为在VS2022中1.1和2.2默认为double类型的常数而double可以隐式转化为float或int编译器就会报错 解决方法是f(1.1f,2.2f);
引用
引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。 赋值与引用
int main()
{int a 10;int b a;a 11;cout b endl;//引用相当于别名别人怎么改它就怎么改return 0;
}如果是赋值的话
int main()
{int a 10;int b a;a 11;cout b endl;//如果是赋值一开始指向都是同个数是相同的地址一旦其中一个改变//由于同个数有两个变量所以另一个只能在别的地址开辟存储别的数return 0;
}引用在参数上的使用以及注意事项
引用可以应用在函数传参上这样函数调用的参数不会额外产生空间可提高时间效率
int add(int* a, int* b)
{return *a *b;
}
int add(int a, int b)
{return a b;
}
int main()
{//int a 10;//int b a;//int a1;//注意引用须初始化变量// int a210;//不可引用常量引用的权限被放大//int c a;//int d a;int a 10;int b 20;int cadd(a, b);//运用到了重载cout c endl;int dadd(a, b);cout d endl;return 0;
}函数返回值的引用
int Count()
{int n 90;return n;
}
int main()
{int ret Count();int ret1 Count();coutretendl;cout ret1 endl;//局部变量空间被销毁了但还是输出正确的答案cout l ret endl//虽然空间被销毁了但值还在那个位置上ret是一个变量可以使用cout l ret1 endl;//临时拷贝被‘l所占领ret1输出随机值//是因为返回的值是随机值或者临时拷贝//该编译器会保留住一个临时拷贝
}以上这种使用方法是错误的而是在调用函数的变量前加上static或者调用的变量是全局变量使变量不会随着函数栈帧销毁而销毁保留变量所属空间去引用才是正确的。
引用与值的时间效率比较
#include time.h
struct A { int a[10000]; };void TestFunc1(A aa) {}void TestFunc2(A aa) {}void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 clock();for (size_t i 0; i 10000; i)TestFunc1(a);size_t end1 clock();// 以引用作为函数参数size_t begin2 clock();for (size_t i 0; i 10000; i)TestFunc2(a);size_t end2 clock();// 分别计算两个函数运行结束后的时间cout TestFunc1(A)-time: end1 - begin1 endl;cout TestFunc2(A)-time: end2 - begin2 endl;//8:0,传值还需要不断创建参数栈帧和销毁而引用不用}常引用 int a 10;//int b a;//引用时权限平等const int b a;//引用时可权限放小cout b endl;//10a 20;cout b endl;//20//a修改时b有相当于只读所读值也会改变b 20;//错误引用的b虽然同样是a的别名但是权限只限制于读即b是无法修改的const int c a;//可以赋值时c是另一个变量const把他变为常变量所以引用的权限可以平等和放小但不能放大就像一个常量不能用int来进行引用