前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打开C嘎嘎的大门:你好,C嘎嘎!(1)

打开C嘎嘎的大门:你好,C嘎嘎!(1)

作者头像
用户11295429
发布2024-10-16 17:09:01
610
发布2024-10-16 17:09:01
举报
文章被收录于专栏:王的博客专栏

前言:

小编在学习完一些数据结构以后,终于,我还是来到了这一步,开始学习我小学就听说过的C++,至于为什么标题写的C嘎嘎,因为小编觉着这样好念而且有意思,今天是小编学习C嘎嘎的第一天,为了不让我越学就忘记前面的知识,于是诞生了这一篇文章,那么现在废话不多说,开启今天的C嘎嘎之旅!

正文:

❀1.C嘎嘎是什么

C嘎嘎的发明是咱们祖师爷——本贾尼教授在1979年在使用C语言的时候越来越发现C语言的一些不足,于是后来就自己开始在C语言的基础上开始增强C语言的功能(我真的佩服这些发明语言的大佬们,他们觉着语言不行就开始自己发明语言,而小编只会在各种社交app上吐槽,这就是差距),后来增加的功能越来越多,这时候就诞生了现在小编所讲的:C++!

所以说,C++其实就是C语言的一个更高级的版本,它同样是可以用C语言的一些功能的,这个小编后续讲的时候会体现出来,至于C嘎嘎之后的一些历史,小编就不多叙述了,小编文笔不太行贿,讲不了历史,下面就进入C嘎嘎的学习喽!

❀2.命名空间

命名空间是C嘎嘎比C语言多出来的功能,也是和我们之后学习息息相关的一个内容,大家一定要好好理解这个:

❀2.1.命名空间的概念和定义
2.1.1.引例

在讲命名空间的概念之前,小编先给各位一段代码让各位判断这个代码对不对:

代码语言:javascript
复制
#include<stdio.h>
 int rand = 1;
int main()
{
   printf("%d",rand);
   return 0;
}

这个代码看上去是非常正确的,无非就是设置了一个全局变量,然后打印出变量的内容罢了,想必各位读者朋友也是这么想的,的确,这个代码是正确的,那么小编再给各位一段代码,让大家来判断这个代码是否是正确的:

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
int rand = 1;
int main()
{
   printf("%d",rand);
   return 0;
}

到这里很多读者朋友可能会有疑问了,这个代码和上面那个·代码不就多了一个头文件吗,这俩不应该是一样的吗?其实小编这里给大家埋了个坑,请各位读者朋友看我变量名是什么:rand,这个可能很多小伙伴见过,这是一个生成随机数(伪)的库函数,小编也在之前的扫雷游戏中用过这个库函数,小编给大家看看这个库函数的介绍:

所以说上面那个代码使用起来是会报错的,下面给大家展示一下报错原因:

当然,如果rand在函数内部是不会报错的,因为在函数内部属于局部变脸,想要打印它的时候,编译器会首先在main函数内部查找,然后再往后上找,rand属于全局变脸,头文件会在预编译的的时候打开,二者都在全局,所以会重定义,那么,如果我们非要让rand作为全局变量,然后也可以使用它我们有什么方法可以实现这个操作呢?既然小编这么说了,解决办法肯定是有的,那么小编就要进入本小节所要讲的:命名空间了。

2.1.2.命名空间的概念

命名空间的存在,实际上就是为了解决小编前面说过的,为了让我们既可以使用rand函数,也可以使用全局变量rand,命名空间就是解决这个问题的关键,命名空间实际上的作用就是来隔离名字的,为了解决一些程序中由于名字冲突或者名字污染而带来的一些问题,C嘎嘎特地引入了命名空间来解决,它在编译器是用namespace关键字来表示的,下面小编讲述一下namespace的一些定义来帮助大家理解namespace是如何在代码中进行表示的:

2.1.3.命名空间的定义

1.在定义命名空间的时候,就需要用到namespace关键字,后面需要跟着名字(自己设定的,可以把它想成我们在使用结构体时对结构体命名),之后跟着一对{}即可,里面的内容可以是变量,函数,结构体等等,下面小编用代码来展示一下它的定义方法:

代码语言:javascript
复制
namespace wang
{
   int rand = 20;
   int add(int a,int b)
{
   return a + b;
}
   struct wang1
{
   char arr[12];
   int* arr1;
};
}

2.namespace其实本义是定义出了一个域,这个域就叫命名空间域,这个域跟全局域是隔离出来的,所以在里面放入rand函数的时候就可以不和全局域中的rand函数起冲突了,读到这里,可能会有许多读者朋友会好奇域到底是什么东西,下面小编就来介绍一下: 在C++中有着四种域,分别是全局域(就是全局变量呆着的地方),函数局部域(例如main函数内部的内容都属于函数局部域),命名空间域(上面讲的,把一些重复的名字隔离出来的域),类域(后期会学,这个我现在也不懂,我刚学C嘎嘎)。所以这里就解释了为什么命名空间可以把变量给隔离出来,因为域本身就是不同的,并且,局部域和全局域是会影响生命周期的(这个在C的时候学过),对于什么是生命周期,用小编的话来说,生命周期就是一个变量从出生到销毁的过程,那么小编这里给读者朋友出一个问题,对于命名空间里的数据,他是属于全局变量还是局部变量?其实它是全局变量,因为命名空间仅仅是对名字进行隔离,除去命名空间这些内容还是在全局中。

3.namespace命名空间是可以进行嵌套的,那么为什么要去嵌套呢?小编这里就举一个例子来说,我们首先先设置一个域定为wang,有一天我和小明在编写项目的时候,我俩同时都想用变量x,并且我俩都不想做出让步,此时我们不能因为这件事打一架吧,此时就可以用嵌套来解决这个问题,下面是代码示意图:

代码语言:javascript
复制
namespace wang
{
   namespace wang1
{
    int x = 12;
}
   namespace ming1
{
    int x = 13;
}
}

4.最后说一下一个小的知识点,C嘎嘎的标准库都放到了一个叫做std的命名空间里,我们想要使用一些函数是就需要调用命名空间才能使用,那么如何对命名空间进行使用呢,不要着急,下面进入命名空间环节!

❀2.2.命名空间的使用
2.2.1.域作用限定符 " :: "

我们已经知道了命名空间如何设定,那么我们如何去使用命名空间里面的数据呢?这里就需要用到一个操作符:域作用限定符:"::",它的作用类似于我们在使用结构体数据的时候的 . 操作符,是用来取命名空间里的数据的,下面小编就拿一段代码来让读者朋友知道这个符号的使用:

代码语言:javascript
复制
#include<stdio.h>
int x = 20;

namespace wang
{
	int x = 10;
}

int main()
{
	int x = 5;
	printf("%d", x);  //小编之前说过,编译器在查找数据的时候先找局部在找全局,并且小编在之前写C语言的文章说过:在使用同一变量的时候优先使用局部变量
	printf("%d", wang::x);  //  ::的左边放名字,右边放取的内容
	printf("%d", ::x);  //如果左边为空,则取出的是全局域的内容
}

这个符号具体的使用小编在代码页已经解释清楚了,这里也重复一遍," :: "的左边放置域的名字,如果为空那么就是取出的是全局域的数据,也就是取出的是全局变量 ,这里可能会有一些读者朋友发话了:那么函数局部域的数据是否可以通过域作用限定符来进行取数据呢,很遗憾这是不可以的,这里跟函数局部域的生命周期有关,因为出了函数数据就会被销毁,所以此时我们不可以调用函数局部域的数据,那么使用命名空间的数据只有一种方法吗?当然是不可能的啦 ,小编目前所知命名空间的使用方法有两种,下面小编就开讲第二种方法:

2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)

正如标题所说,小编不怎么会去推荐这个方法来使用命名空间的数据,因为这个风险性很高的,我们先来说说用法,再来讲讲危害,下面用代码来代替文字:

代码语言:javascript
复制
namespace wang
{
	int x = 13;
}

using namespace wang;

int main()
{
	printf("%d", x);   //这里可以直接2使用
}

通过using操作符,我们可以直接使用wang里面的所有数据,这样方便吗?方便。这样风险大吗?很大。我们使用命名空间的目的就是把名字隔离开,如果我们直接使用using,会直接把里面的内容全部展开,此时这里的x就相当于全局域的数据,很有可能再次出现名字冲突的危机,在我们写一些简单的算法题等等可以用它,可是等我们将来写项目的时候,我们如果用这个,真的就是埋了一颗定时炸弹,总有一天这个炸弹会在不经意间爆炸,那时候我们还得因为改数据而变得焦头烂额,所以这个方法能不用就不用,这里可能有些读者朋友会说,如果我们仅仅使用部分成员的话,这些数据常常使用并且不会造成什么危险的话,有办法实现吗?这是肯定的,小编现在讲述的第三种方法就是解决这个问题的,下面进入命名空间使用的第三种方法:

2.2.3.第三种使用办法:using展开部分成员

这个方法算是比第二种方法好,但是远远比不上第一种方法安全,不过有时候也是很方便的,下面小编通过代码来展示一下这个方法的使用:

代码语言:javascript
复制
namespace wang
{
	int x = 20;
	int add(int a, int b)
	{
		return a + b;
	}
}

using wang::x;

int main()
{
	printf("%d", x);
}

这里是仅仅把x = 20展开了,这里也用到了“ :: ”操作符,可以理解为,先让wang把x内容展现出来,我们用using来去使用这个x,正如上文所说,对于一些我们常常使用到的命名空间里的数据,我们可以用这种方法来进行使用,但是安全系数还是不算太高的,所以总结来说,小编还是比较推荐第一种使用方法的,以上就是命名空间的使用方式,下面我们来正式进入C嘎嘎的代码的书写,开始了解C嘎嘎版本的打印和输入函数!

❀3.C嘎嘎的输入 && 输出

在开始正式内容之前,小编先提一嘴,C嘎嘎也是有头文件的,它的头文件是:iostream,是标准输入输出流库,在我们写代码的时候一定要记得它!不然我们就无法使用下面出现的函数,下面进入正式内容:

❀3.1.输出函数——cout
3.1.1.cout函数的概念

我们前面在学习C语言的时候,我们学到的输出函数是printf函数,C嘎嘎可以使用吗,答案是肯定的,C嘎嘎是在C的基础上实现的,自然也可以使用print函数,但我们C嘎嘎也有自己的输出函数,那就是 :cout函数!

cout函数是我们在C嘎嘎常常用来执行输出,也就是打印操作的函数,它的printf更好的功能就是它不再需要%d,%f之类的占位符,它会自动识别变量的数据,这是小编认为优化比较好的功能,那么我们如何使用cout函数呢?别急,上面就是对cout函数的介绍,下面我们进入cout函数的使用环节!

3.2.2.cout函数的使用

这里面就要介绍一下一个不算船新的操作符:"<<",可能一些对于C语言颇有研究的读者朋友会说:这不就是C语言中的左移操作符吗?nonono,在C嘎嘎中,它可以是左移操作符,也可以是流插入运算符,这些都是靠情况而定的,它是搭配着cout进行使用的,在写代码之前,不知读者朋友是否还记得上面所说的std,这是一个标准库的命名空间,我们的cout函数和cin函数就存在里面,我们在使用之前一定要调用标准库,不然我们无法使用cout函数,下面展现一下cout函数到底如何去使用:

代码语言:javascript
复制
#include<iostream>
using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

//using std::cout;
//using std::cin;


int main()
{
	int x = 20;
	cout << x;  //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
	cout << "hello world";   //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
	return 0;
}

使用方法小编在上面讲述了,各位可以根据小编用的记忆法来知道cout函数的使用,我们在C阶段的时候,我们有时候需要换行操作,那个时候使用“ \n ”来实现的,那么我们在C嘎嘎也可以使用这个换行符吗?对于部分编译器这个是可以的,不过小编不太推荐使用这个方法,因为有些编译器它是不在接受这个换行符了,那么这个时候我们就又用到了一个函数,那就是endl函数,这个函数是专门来换行的,它的作用是:在流插入输出时,相当于插入了一个换行字符加刷新缓冲区,这是小编复制的一个官方的解释,读者朋友只要记住,它的作用就是换行,下面小编给出代码展示:

代码语言:javascript
复制
#include<iostream>
using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

//using std::cout;
//using std::cin;


int main()
{
	int x = 20;
	cout << x << '\n';  //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
	cout << "hello world\n";   //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
	//上面都是C语言时的换行写法,各位读者朋友少使用,下面的方法才是常使用的
	cout << x << endl;
	cout << "hello world" << endl;
	return 0;
}

我们在C语言的学习过程中对于打印数据的时候,我们可以控制打印几位数,可以控制小数点后面的几位,那么cout函数可以实现这些功能吗?那当然是,不可以的,cout函数虽然方便但有些功能他就是实现不了,这个时候我们只能依靠printf函数来实现了,所以咱并不能说printf函数是一无是处的,它在某些方面还是蛮不错的,下面我们讲述完了输出函数,下面我们讲述输入函数喽!

❀3.2.输入函数——cin
3.2.1.cin函数的概念

此时这里的cin函数就类似我们在C语言阶段学到的scanf函数,就是往控制台输入东西,然后在C阶段的时候我们配合着printf函数来进行在控制台打印数据的,只不过在C嘎嘎阶段我们是配合着cout函数来实现输入输出的,cin函数也比scanf函数好用许多,因为scanf函数我们需要用占位符以及用到变量的地址我们才可以打印数据,在cin函数这通通都不需要,下面小编来给各位讲述一下对于cin函数的使用

3.2.2.cin函数的使用

对于cin函数的使用,这里我还要讲到一个操作符,可能已经有许多的读者朋友已经猜到了,那就是:“>>” 流提取运算符,这个可能也有读者朋友会说了,这不是C语言的右移操作符?确实在C语言是这样的,但现在是C嘎嘎,它也可以是流提取运算符,下面小编通过代码来给各位读者朋友了解cin函数的用法:

代码语言:javascript
复制
#include<iostream>


using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

using std::cout;
using std::cin;



int main()
{
	int x = 0;
	cin >> x;  //这个可以想成从cin函数里面读取数据到x , 也是一种水的流动
	cout << x << endl;
	return 0;
}

对于这个cin函数的理解方法,小编在上面的代码说明了,其实它和cout函数我们都可以记成水的流动,只不过方向不同罢了,一个是从数向控制台流动,一个是控制台向数流动,对于cin函数的使用,读者朋友要记住他的用法!看完cin函数和cout函数读者朋友是否感到:

小编在学习的时候也是这么觉得很nice,在本节最后小编提醒一下读者朋友,其实cin,cout函数的对于算法题的运行效率不是太高,如果做到一些相关的算法题,可以加入下面的代码来进行改善。

代码语言:javascript
复制
int main() {
    在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
        可以提⾼C++ IO效率 ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return 0;
}

❀❀❀ 总结❀❀❀

本来小编还想写多一点内容的,不过感觉文章篇幅有点长了,于是分成了两篇文章来进行书写,今天是小编学习C嘎嘎的第一天,已经对新语言的学习充满了期待,就像我当初学习C语言一样,如果文章有错误,恳请读者朋友在评论区指出,小编会吸取错误并进行改正,那么我们下篇文章见啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ❀1.C嘎嘎是什么
  • ❀2.命名空间
    • ❀2.1.命名空间的概念和定义
      • 2.1.1.引例
      • 2.1.2.命名空间的概念
      • 2.1.3.命名空间的定义
    • ❀2.2.命名空间的使用
      • 2.2.1.域作用限定符 " :: "
      • 2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)
      • 2.2.3.第三种使用办法:using展开部分成员
  • ❀3.C嘎嘎的输入 && 输出
    • ❀3.1.输出函数——cout
      • 3.1.1.cout函数的概念
    • ❀3.2.输入函数——cin
      • 3.2.1.cin函数的概念
  • ❀❀❀ 总结❀❀❀
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档