精华内容
下载资源
问答
  • 使用vs编译的二维小游戏,里面有很多小游戏和网站模板,比如超级玛丽、坦克大战、推箱子、别踩白块、贪吃蛇、种地浇水、盒子接球、连连看、军棋、五子棋、火车订票系统、图书馆借阅、涂格子游戏、火柴人游戏、大丰收...
  • 本资源是针对C语言初学者的期末课题设计,采用C语言编写的一个小程序,通过循环、选择、调用等一系列C语言基础语句,实现了一段踢足球的小动画,代码简单易懂,运行效果良好,供大家学习与参考
  • log打印函数,功能如下: 1 可控制宏DEBUG决定log,输出等级,默认为3,输出ULOGE,ULOGW,ULOGI 2 宏LOG_TAG输出log所在的模块,可将此宏放到makefile中或.h中或.cpp赋值, 3 输出log等级,所在模块信息,所在...
  • 本文浅析了ARM汇编 C语言 C++ 相互调用的方法。
  • C语言 C++ 面试

    2020-02-07 04:10:34
    C语言 C++ 面试 C语言 C++ 面试 C语言 C++ 面试 C语言 C++ 面试
  • 比libwebsockets 更好用更方便 此为C/C++实现的websocket 模块.支持WINDOWS,LINUX 版本,你可以使用此开发出客户端,服务器
  • C语言C++实现ADS通讯(C TC3),含文档和程序
  • C C++ 库函数 所有的C C++ 库函数,每个库函数都有简练的功能概括
  • C语言C++的6点区别

    2021-01-01 15:50:04
    C语言中源文件的后缀名是.cC++源文件后缀名是.cpp (4)函数返回值不同 C语言中如果一个函数没有指定返回值类型,默认返回int类型;C++中如果一个函数没有返回值则必须指定为void (5)函数重载
  • 谭浩强C语言C++集合包

    2018-08-06 16:01:53
    谭浩强C语言C++集合包,是一个包含多个关于谭浩强C语言,与C++初学者入门的资料集合。
  • c语言 C++中库函数

    2012-11-24 14:43:32
    对于C C++中各种库的函数进行说明 方便使用
  • C语言C++的区别

    万次阅读 多人点赞 2018-08-02 00:12:28
    现在我们常用的C语言C89标准,C++C++99标准的。C89就是在1989年制定的标准,如今最新的是C11和C++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本文在讨论的时候使用...

    c语言虽说经常和c++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++是C++99标准的。C89就是在1989年制定的标准,如今最新的是C11和C++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本文在讨论的时候使用的C语言标准是C89,C++标准是C++99.我们来介绍C语言和C++中那些不同的地方。

    • 1.函数默认值

    在C++中我们在定义或声明一个函数的时候,有时会在形参中给它赋一个初始值作为不传参数时候的缺省值,例如:

    int FUN(int a = 10);

    代表没有传参调用的时候,自动给a赋一个10的初始值。然而这种操作在c89下是行不通的,在c语言下这么写就会报错。

    我们都知道,系统在调用任何一个函数的时候都有函数栈帧的开辟,如果函数有参数则需要压入实参。平常在我们人为给定实参的时候,是按照参数列表从右向左依次将参数通过

    mov  eax/ecx   dword ptr[ebp-4]       //假设是int数据

    指令传入寄存器,再通过push指令压入。现在我们已经给定了函数参数的默认值,那么在压实参的时候只需要一步push初始值即可。效率更高。

    另外需要注意的是,赋初始值必须从参数列表的右边开始赋值,从左边开始赋值将会出错:

    int sum1(int a = 10,int b);        //错误
    int sum2(int a,int b = 20);            //正确
    

    因为如果sum1的声明是正确的,那么我们调用的时候怎么调用?sum1( ,20)?很可惜这样属于语法错误,调用这么写既然不对那就当然不能这样赋初始值了。相反,sum2的调用:sum2(20);合情合理,没有任何问题。

    实际在写工程的时候,我们都习惯将函数的声明写在头文件中而非本文件里,然后在不同的文件中写出它们的定义。那么这种情况可以赋初始值吗?当然可以,不论是定义还是声明处,只要你遵守从右向左赋的规则就可以。甚至你还可以这样给初始值:

    int  fun(int a ,int b = 10);
    int  fun(int a = 20,int b);

    眼尖的同学看见了下面的那行代码大喊错误,因为先给左边赋值了!

    其实这样声明完全没有问题,两句声明是同一个函数(函数多次声明没有问题),第一句已经给b了一个初始值,运行到第二句时已经等价于int fun(int a = 20,int b = 10);了。但是注意,这两句的顺序不能反转,否则就是错误的。

     

    总结:C89标准的C语言不支持函数默认值,C++支持函数默认值,且需要遵循从右向左赋初始值。

     

    • 2.inline内联函数

    说到内联函数大家应当不陌生,它又是一个C89标准下C语言没有的函数。它的具体做法和宏非常相似,也是在调用处直接将代码展开,只不过宏它是在预编译阶段展开,而内联函数是在 编译阶段进行处理的。同时,宏作为预处理并不进行类型检查,而inline函数是要进行类型检查的,也就可以称作“更安全的宏”。

    内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中,include之后就可以使用,由于调用时直接代码展开所以我们根本不需要担心什么重定义的问题——它连符号都没有生成当然不会所谓重定义了。普通函数生成符号,内联函数不会生成符号。

    关于inline还需要注意的一点是,我们在使用它的时候往往是用来替换函数体非常小(1~5行代码)的函数的。这种情况下函数的堆栈开销相对函数体大小来说就非常大了,这种情况使用内联函数可以大大提高效率。相反如果是一个需要很多代码才能实现的函数,则不适合使用。一是此时函数堆栈调用开销与函数体相比已经是微不足道了,二是大量的代码直接展开的话会给调试带来很大的不便。三是如果代码体达到一个阈值,编译器会将它变成普通函数。

    同时,递归函数不能声明为inline函数。说到底inline只是对编译器的建议,最终能否成功也不一定。同时,我们平常生成的都是debug版本,在这个版本下inline是不起作用的。只有生成release版时才会起作用。

    总结:C89没有,在调用点直接展开,不生成符号,没有栈帧的开辟回退,仅在Release版本下生效。一般写在头文件中。

     

    • 3.函数重载

    C语言中产生函数符号的规则是根据名称产生,这也就注定了c语言不存在函数重载的概念。而C++生成函数符号则考虑了函数名、参数个数、参数类型。需要注意的是函数的返回值并不能作为函数重载的依据,也就是说int sum和double sum这两个函数是不能构成重载的!

    我们的函数重载也属于多态的一种,这就是所谓的静多态。

    静多态:函数重载,函数模板

    动多态(运行时的多态):继承中的多态(虚函数)。

    使用重载的时候需要注意作作用域问题:请看如下代码。

    #include <iostream>
    
    using namespace std;
    
    bool compare(int a,int b)
    {
        return a > b;
    }
    
    bool  compare(double a,double b)
    {
        return a > b;
    }
    
    int main()
    {
        //bool compare(int a,int b);
        compare(10,20);
        compare(10.5,20.5);
        return 0;
    }
    

    我在全局作用域定义了两个函数,它们由于参数类型不同可以构成重载,此时main函数中调用则可以正确的调用到各自的函数。

    但是请看main函数中被注释掉的一句代码。如果我将它放出来,则会提出警告:将double类型转换成int类型可能会丢失数据。

    这就意味着我们编译器针对下面两句调用都调用了参数类型int的compare。由此可见,编译器调用函数时优先在局部作用域搜索,若搜索成功则全部按照该函数的标准调用。若未搜索到才在全局作用域进行搜索。

     

    总结:C语言不存在函数重载,C++根据函数名参数个数参数类型判断重载,属于静多态,必须同一作用域下才叫重载。

     

    • 4.const

     

    这一部分非常重要。在我的另一篇博客“C语言的32个关键字”中对C语言中的const也有所讲解。当中提到了这么一个问题:C语言中被const修饰的变量不是常量,叫做常变量或者只读变量,这个常变量是无法当作数组下标的。然而在C++中const修饰的变量可以当作数组下标使用,成为了真正的常量。这就是C++对const的扩展。

    C语言中的const:被修饰后不能做左值,可以不初始化,但是之后没有机会再初始化。不可以当数组的下标,可以通过指针修改。简单来说,它和普通变量的区别只是不能做左值而已。其他地方都是一样的。

    C++中的const:真正的常量。定义的时候必须初始化,可以用作数组的下标。const在C++中的编译规则是替换(和宏很像),所以它被看作是真正的常量。也可以通过指针修改。需要注意的是,C++的指针有可能退化成C语言的指针。比如以下情况:

    int b = 20;
    const int a = b;

    这时候的a就只是一个普通的C语言的const常变量了,已经无法当数组的下标了。(引用了一个编译阶段不确定的值)

    const在生成符号时,是local符号。即在本文件中才可见。如果非要在别的文件中使用它的话,在文件头部声明:extern cosnt int data = 10;这样生成的符号就是global符号。

    总结:C中的const叫只读变量,只是无法做左值的变量;C++中的const是真正的常量,但也有可能退化成c语言的常量,默认生成local符号。

     

    • 5.引用

    说到引用,我们第一反应就是想到了他的兄弟:指针。引用从底层来说和指针就是同一个东西,但是在编译器中它的特性和指针完全不同。

        int a = 10;
    	int &b = a;
    	int *p = &a;
    
    	//b = 20;
    	//*p = 20;

    首先定义一个变量a = 10,然后我们分别定义一个引用b以及一个指针p指向a。我们来转到反汇编看看底层的实现:

    可以看到底层实现完全一致,取a的地址放入eax寄存器,再将eax中的值存入引用b/指针p的内存中。至此我们可以说(在底层)引用本质就是一个指针。

    了解了底层实现,我们回到编译器。我们看到对a的值的修改,指针p的做法是*p = 20;即进行解引用后替换值。底层实现:

    再来看看引用修改:

    我们看到修改a的值的方法也是一样的,也是解引用。只是我们在调用的时候有所不同:调用p时需要*p解引用,b则直接使用就可以。由此我们 推断出:引用在直接使用时是指针解引用。p直接使用则是它自己的地址。

    这样我们也了解了,我们给引用开辟的这块内存是根本访问不到的。如果直接用就直接解引用了。即使打印&b,输出的也是a的地址。

    在此附上将指针转为引用的小技巧:int *p = &a,我们将 引用符号移到左边 将 *替换即可:int &p = a。

    接下来看看如何创建数组的引用:

    int array[10] = {0};       //定义一个数组

    我们知道,array拿出来使用的话就是数组array的首元素地址。即是int *类型。

    那么&array是什么意思呢?int **类型,用来指向array[0]地址的一个地址吗?不要想当然了,&array是整个数组类型。

    那么要定义一个数组引用,按照上面的小诀窍,先来写写数组指针吧:

    int (*q) [10] = &array;

    将右侧的&对左边的*进行覆盖:

    int (&q)[10] = array;

    测试sizeof(q) = 10。我们成功创建了数组引用。

     

    经过上面的详解 ,我们知道了引用其实就是取地址。那么我们都知道一个立即数是没有地址的,即

    int &b = 10;

    这样的代码是无法通过编译的。那如果你就是非要引用一个立即数,其实也不是没有办法:

    const int &b  = 10;

    即将这个立即数用const修饰一下,就可以了。为什么呢?

    这时因为被const修饰的都会产生一个临时量来保存这个数据,自然就有地址可取了。

     

    总结:引用底层就是指针,使用时会直接解引用,可以配合const对一个立即数进行引用。

     

    • 6.malloc,free && new,delete

    这个问题很有意思,也是重点需要关注的问题。malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。而new和delete是C++运算符、关键字。new和delete底层其实还是调用了malloc和free。它们之间的区别有以下几个方面:

    ①:malloc和free是函数,new和delete是运算符。

     

    ②:malloc在分配内存前需要大小,new不需要。

    例如:int *p1 = (int *)malloc(sizeof(int));

               int *p2 = new int;     //int *p3 = new int(10);

    malloc时需要指定大小,还需要类型转换。new时不需要指定大小因为它可以从给出的类型判断,并且还可以同时赋初始值。

     

    ③:malloc不安全,需要手动类型转换,new不需要类型转换。

    详见上一条。

     

    ④:free只释放空间,delete先调用析构函数再释放空间(如果需要)。

    与第⑤条对应,如果使用了复杂类型,先析构再call operator delete回收内存。

     

    ⑤:new是先调用构造函数再申请空间(如果需要)。

    与第④条对应,我们在调用new的时候(例如int *p2 = new int;这句代码 ),底层代码的实现是:首先push 4字节(int类型的大小),随后call   operator new函数分配了内存。由于我们这句代码并未涉及到复杂类型(如类类型),所以也就没有构造函数的调用。如下是operator new的源代码,也是new实现的重要函数:

    void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
            {       // try to allocate size bytes
            void *p;
            while ((p = malloc(size)) == 0)
                    if (_callnewh(size) == 0)
                    {       // report no memory
                            _THROW_NCEE(_XSTD bad_alloc, );
                    }
     
            return (p);
            }

    我们可以看到,首先malloc(size)申请参数字节大小的内存,如果失败(malloc失败返回0)则进入判断:如果_callnewh(size)也失败的话,抛出bad_alloc异常。_callnewh()这个函数是在查看new handler是否可用,如果可用会释放一部分内存再返回到malloc处继续申请,如果new handler不可用就会抛出异常。

     

    ⑥:内存不足(开辟失败)时处理方式不同。

    malloc失败返回0,new失败抛出bad_alloc异常。

     

    ⑦:new和malloc开辟内存的位置不同。

    malloc开辟在堆区,new开辟在自由存储区域。

     

    ⑧:new可以调用malloc(),但malloc不能调用new。

    new就是用malloc()实现的,new是C++独有malloc当然无法调用。

    • 7.作用域

    C语言中作用域只有两个:局部,全局。C++中则是有:局部作用域,类作用域,名字空间作用域三种。

    所谓名字空间就是namespace,我们定义一个名字空间就是定义一个新作用域。访问时需要以如下方式访问(以std为例)

    std::cin<< "123" <<std::endl;

    例如我们有一个名字空间叫Myname,其中有一个变量叫做data。如果我们希望在其他地方使用data的话,需要在文件头声明:using Myname::data;这样一来data就使用的是Myname中的值了。可是这样每个符号我们都得声明岂不是累死?

    我们只要using namespace Myname;就可以将其中所有符号导入了。

    这也就是我们经常看到的using namespace std;的意思啦。

    展开全文
  • C语言C++中文帮助文档

    2016-03-07 11:27:26
    C语言C++中文帮助文档,免费下载,无需积分。
  • C语言C++编程软件推荐及下载方式

    千次阅读 多人点赞 2020-02-08 23:01:14
    几款常用C语言C++编程软件推荐及详细下载过程 文章目录0.什么是IDE 0.什么是IDE  1.既然要学习编程那么编程软件对程序员而言是十分重要的,它为我们提供人性化的项目文件创建方式,编译器为我们提供语法错误的实时...

    windows下几款常用C语言C++编程软件推荐及下载过程

    0.什么是IDE

     1.既然要学习编程那么编程软件对程序员而言是十分重要的,它为我们提供人性化的项目文件创建方式,编译器为我们提供语法错误的实时检查,它就是我们盖建高楼大厦的工具,没有编程软件无论是开发效率还是开发速度都会大大缩水,所以对编程软件的了解以及使用是每一位程序员必须要掌握的。
     2.相信大家经常听到别人说到IDE这个名词,那么IDE是什么意思呢?IDE是英文Intergrated Development Environment的缩写,中文意思是集成开发环境,是为程序员提供开发环境的应用程序。一般来讲由编辑器,编译器,用户图形界面,调试器四大部分构成。
     3.某些写代码的工具只是代码编辑器,并没有自动为我们配好编译器及一些必要的开发环境(例如深受许多人喜欢的vs code),在后面我们会详细介绍vs code的安装方法。

    先说明一下我的安装环境是64位Win10系统,浏览器:搜狗

    1.CodeBlocks(C语言C++皆可,无需配置环境)

    优点:

    1. 无需配置环境
    2. 使用简单
    3. 打开速度快

    缺点:

    1. 补全做得不太好,需要手敲比较多。

    新手推荐程度:三星★★★

    1.1 安装过程

    1.百度搜索:codeblocks官网
    第一步
    2.进入官网,选择download
    第二步
    3. 选择下载版本(按图中所示进行操作)
    第三步
    点击跳转之后稍等两秒钟就会弹出下载界面
    4.下载
    最后
    然后耐心等待即可。

    1.2 新建项目

    1.安装好后打开codeblocks
    新建项目
    2.建立项目
    建立项目
    3.然后根据提示填写文件名,选择文件路径即可开始编程啦!!

    2.devc++(C语言C++皆可,无需配置环境)

     第二个推荐的是devc++,只是我用的第二个ide。渐渐不用codeblocks之后我就把阵营转向了devc++,然后直到现在我仍然在较为频繁的适用devc++,因为它足够轻量级,打开速度快,编译速度快,报错也较为友好。
    优点:

    1. 无需配置环境
    2. 打开速度快
    3. 报错清晰友好

    缺点:

    1. 补全做得不太好。

    和codeblocks比较的类似,但是打开速度比codeblocks快,界面也稍微好看一点点。
    推荐程度:四星★★★★

    2.1 安装过程

    1.百度devc++下载,这里我们选择第一个就可以了,点击普通下载
    百度
    2.点击下载
    下载

    2.2 新建项目

    1.双击打开devc++,然后按图示操作
    2
    2.填写项目内容
    3
    3.然后你就可以开始编程啦~~!!

    3.visual studio(C语言C++皆可,无需配置环境)

    优点:

    1. 补全做得非常好。
    2. 行末输入分号结束语句时会替你自动格式化代码,不需要再担心排版不好看啦!
    3. 功能完整全面。
    4. 项目管理友好,一键式操作。

    缺点:

    1. 体量太大,占用硬盘大,占用内存也不小,对电脑配置有一定要求(4g内存吃力)。
    2. 需要一段学习时间,因为功能实在是太多太强大,所以需要学习。有些说法在vs当中也不同(例如把工程叫做解决方案)
    3. 功能太多,许多功能对于新人来说都用不到,稍显臃肿。所以下载的时候酌情下载组件。

    推荐程度:三星★★★

    下载过程:
    1.百度 微软官网
    1
    2.进入官网
    2
    3.选择 社区版(免费) 进行下载,即可
    3
    4.然后确认弹出的对话框下载 vs intaller,然后进入installer中进行vs的正式下载。

    4.vs code(C语言C++皆可,需要配置环境!!)

     vs code是我目前用的最多也是最喜欢的一个编辑器!!注意是编辑器而不是集成开发环境!!意味着你需要自己配置环境(比较的繁琐)。
    优点:1.界面美观,代码好看
    2.扩展丰富,提升开发效率
    3.操作简便,直观
    缺点:1.代码编译时间太长(我也不知道是我自己电脑的原因还是什么原因)
    2.多文件编译我至今尚未实现(准确的说是因为太麻烦了,我就选择在devc或者vs上面进行多文件,当然我现在涉及到的多文件还是比较少的)
    3.环境配置稍显复杂,新手的话很大概率配不好,还把各种文件夹弄得乱七八糟
    推荐程度:四星★★★★

    4.1 安装过程

    1.下载:下载的地址和上面visual studio的地址相同,并且就在vs的旁边
    14

    4.2 环境配置

    我只简单说说大致流程帮各位理清思路(因为各种教程都十分冗长,我先让大家知道是怎么回事,详细的配置教程我以后可能考虑会出)。
    step:1.安装vs code
    2.下载编译器(一般来说mingw、clang等都是常用的)
    3.将编译器所在目录的bin文件添加到path系统环境变量中:1)左下菜单栏搜索path 2)找到path那一栏,选中,然后进入编辑 3)添加文件路径 4)保存退出
    图示:
    16
    1
    1
    在这里添加上编译器的文件路径即可,保存后退出

    1
    4.在网络上找到.vscode配置文件(很多教程中基本都有,下载即可,这一步很重要!!)
    5.把.vsocde文件放到你的C语言/C++源码文件中(意味着以后你的C语言或者C++源码必须放在由.vscode文件的文件中!这样不会出任何问题。)
    6.进入vscode,进入左边选择配置文件更改一下配置文件中的编译器文件路径(因为做教程的人的文件路径和你的肯定不一样!!所以你必须在必要的地方做修改,大体上不用改变,不会的地方也不要乱改。)
    7.大功告成,你可以开始编程了!!

    4.3 常见问题(头文件无法被检测识别)

     你以为这就结束了?很显然没那么简单,如果你在写自己的头文件(.h文件)时报错提示你无法识别头文件所在路径??你是不是又懵了?
    解决方法:在配置文件中找到include路径的位置(那里有include关键字以及很多文件路径),把你的头文件所在的文件路径的绝对路径加入到include之中,这个问题就得到解决了!

    5. The End

    几款在windows上比较好用的ide推荐就到这里了,这里的用户仅针对windows用户,当然我还知道一些ide也不错比如xcode,vim等等。这些有兴趣大家可以自行下载,有任何问题可以评论区批评指正!

    展开全文
  • C++C语言的关系

    2020-11-28 12:59:24
    cc++的关系 C语言是结构化和模块化的语言,面向过程。未完全实现解决软件设计危机的目标。 c++保留了C语言原有的优点,增加了面向对象的机制。 对C语言的功能做了扩充: 1.变量的定义可以出现在程序中的任何行 2....

    c和c++的关系

    C语言是结构化和模块化的语言,面向过程。未完全实现解决软件设计危机的目标。
    C++保留了C语言原有的优点,还扩充了不少功能 :

    • 增加了面向对象的机制。
    • 对C语言的功能做了扩充:
      1. 变量的定义可以出现在程序中的任何行
      2. 提供了标准输入输出流对象cin,count
      3. 用const定义常变量
      4. 函数重载,函数模板,带默认值的函数
      5. 引用类型
      6. 单目作用域运算符
      7. string类型字符串
      8. 使用new和delete代替malloc和free函数等

    c++的编译和执行过程

    c++的编译和执行过程和C语言的编译和执行过程基本上是一样的,只是环境不一样。
    c++的编译和执行过程

    • (1)编译( 预处理->编译->目标文件)
      形成目标代码/文件,目标代码是编译器的输出结果,常见扩展名为" .o " 或" .obj "
    • (2)连接
      将目标代码跟C++函数库相连接,并将源程序所用的库代码与目标代码合并
      形成最终可执行的二进制机器代码(可执行程序 .exe)
    • (3)运行
      在特定的机器环境下运行C++应用程序
      在这里插入图片描述

    用c++输出一个hello world

    在这里插入图片描述

    通过上图你会发现在c++中导入一个库函数,库函数的名不在需要.h了
    在c++中基本输入输出函数的标准库是iostream
    在C语言中基本输入输出函数的标准库是stdio.h
    

    在这里插入图片描述

    上述代码中:
    using namespace std; 的作用:
    使用名称空间std,std的全称是standard(标准)。
    使用标准的名称空间
    名称空间是一项c++特性,用来在编写大型程序时组织源代码。
    

    当不用标准的名称空间时:代码如下
    在这里插入图片描述

    你会发现名称空间就好像一个标签。
    例: 全国有好多叫 小明的。
    使用河南的名称空间之后
    默认说的小明都是河南的小明(cout)。
    如果没有说明河南的名称空间。
    则在说小明前得加一个前缀.: 河南-小明(std:: cout)
    

    在这里插入图片描述

    endl 和 '\n'的区别
    '\n' 就是代表单纯的换行。
    endl (1)代表换行 (2) fflush(stdin) 清除缓冲区
    

    c++是完全兼容c的
    在这里插入图片描述

    展开全文
  • C语言C++常见面试题(含答案)高清, 最新 c语言 c++ 嵌入式面试必备面试题,内含详细解析答案
  • C语言C++的区别整理详解!

    万次阅读 多人点赞 2018-07-27 16:36:40
    cc++主要区别 根据书中的描述,进行了整理 ...C++实现源代码文件的扩展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、c...

    c和c++主要区别

    根据书中的描述,进行了整理

    推荐一个我自己的C/C++交流裙815393895

    1、 源代码文件的扩展名

    摘自1.4.1

    C++实现源代码文件的扩展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、ccFreestyle Code Warriorcp、cpp、cc、cxx、c++

    另外UNIX系统上的C程序的扩展名为.c

    2、变量定义

    摘自2.2.1

    c语言中,所有的局部变量必须在函数或复合语句开始位置,c++没有这个限制。

    void main()

    {

    int a; //define variable a

    int b; //define variable b

    a = 10;

    printf("a=%d \n", a);

    b = 11;

    printf("b=%d \n", b);

    {

    int temp = 0;

    printf("test variable in processing\n");

    }

    }

    注释:

    a、局部变量a和b位于函数开始位置,变量temp位于复合语句的开始位置。

    b、复合语句(摘自5.1.10):使用两个花括号来构造一条复合语句(代码块)。代码块由一对花括号和它们包含的语句组成。

    3、 auto

    摘自3.4.5

    c语言中, auto用于声明变量为自动变量,auto修饰符的定义里有这么一句“进入包含变量声明的代码时,变量开始存在。当程序离开这个代码块时,自动变量消失了。它所占用的内存可用来做别的事情。”,从“当程序离开代码块时变量消失”、“内存可用来做别的事情”可以推出auto修饰的变量是存储在堆栈中的。而全局变量存储在静态存储区中,所以用auto决不能修饰全局变量。

    C++11标准引入auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型

    与原来那些只对应一种特定类型的说明符不同,auto让编译器通过初值来推算变量类型。显然,auto定义的变量必须要有初始值。

    auto i=0,*p=&i; //正确,i是整数,p是整形指针

    4、stuct

    摘自4.4

    在C语言中, struct类型的定义必须加上struct的前缀

    struct opt {

    int len;

    int value;

    };

    void main()

    {

    struct opt tmp;

    tmp.len = 1;

    tmp.value = 2;

    }

    而在C++中,struct可以直接使用其类型名来定义

    #include <iostream>

    struct opt {

    int len;

    int value;

    };

    int main()

    {

    opt tmp;

    tmp.len = 1;

    tmp.value = 2;

    std::cout<<tmp.len<<std::endl;

    std::cout<<tmp.value<<std::endl;

    return 0;

    }

    相比之下,C++的语法更简洁一些。所以在用C语言编写代码的时候,C程序员通常是这么来定义的struct的。在下面的代码中,使用typedef来定义一个opt的类型

    typedef struct _opt {

    int len;

    int value;

    }opt;

    void main()

    {

    opt tmp;

    tmp.len = 1;

    tmp.value = 2;

    }

    5、stuct初始化

    推荐一个我自己的C/C++交流群 815393859

    摘自4.4.2

    与数组一样,c++11也支持将列表初始化用于结构,且等号(=)是可选的:

    opt tmp {1, 2};

    其中不允许缩窄转换,例如:

    opt tmp {1.0, 2};

    编译报错:

    error: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { }

    c语言可以使用列表初始化,但是等号(=)是必须的。

    opt tmp = {1,2};

    6、枚举的取值范围

    摘自4.6.2

    c++现在通过强制类型转换,增加了可以赋值给枚举变量的合法值。

    每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数赋值给枚举变量,即使这个值不是枚举值例如,假设bits 和myflag 的定义如下:

    enum bits{ one=1,two=2,four=4,eight=8};

    bits myflag;

    则下面的代码是合法的:

    myflag=bits(6);//正确,因为 6在bits的范围

    取值范围的定义:首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。

     

    例如对于:

    enum bigstep{first,second = 100,third};

    最大枚举值是101,在2的幂中,比这个值大的最小的值为128,因此取值范围上限为127.

    要知道下限,需要知道枚举量的最小值.如果它不小于0,则取值范围的下限为0.否则,采取与寻找上限方式同样的方式,但加上负号,

    例如,如果最小的枚举量为-6,则比它小的,2的幂最大的值为-8,加1之后为-7.于是,上限与下限便能算出来.

    c语言中不能定义这样的变量:bits myflag;

    7、for循环

    摘自5.1

    C++11新增一种循环:基于范围(range-based)的for循环:简化一种常见的循环任务:对数组(或容器类,如vector和array)的每个元素执行相同的操作.

    格式如下:

    for(Type VarName : Array){

      //每个元素的值会依次赋给 VarName

    }

    示例:

    double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};

    for (double x : prices)

    std::cout<<x<<std::endl;

     

    8、逻辑运算符的另一种表示

    摘自6.2.6

    并不是所有的键盘都提供了用作逻辑运算符的符号,标识符and、or和not都是c++保留字,这意味着不能将它们用作变量名等。它们不是关键字,因为它们都是已有语言特性的另一种表示方式。另外,它们并不是c语言中的保留字,但c语言程序可以将它们用作运算符,只要在程序中包含了头文件iso646.h.

    逻辑运算符:另一种表示方式

    运算符另一种表示方式&&and||or!not

    9、c++字符库函数cctype

    摘自6.3

    cctype中通常包括一些常用函数的判断,如某个字符是否为大写,用isupper()如果参数是大写字母,函数返回true, 还有像isalnum(),如果参数是字母数字,即字母或者数字,函数返回true.

    函数名称 返回值

    isalnum() 如果参数是字母数字,即字母或者数字,函数返回true

    isalpha() 如果参数是字母,函数返回true

    isblank() 如果参数是水平制表符或空格,函数返回true

    iscntrl() 如果参数是控制字符,函数返回true

    isdigit() 如果参数是数字(0-9),函数返回true

    isgraph() 如果参数是除空格之外的打印字符,函数返回true

    islower() 如果参数是小写字母,函数返回true

    isprint() 如果参数是打印字符(包括空格),函数返回true

    ispunct() 如果参数是标点符号,函数返回true

    isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true

    isupper() 如果参数是大写字母,函数返回true

    isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true

    tolower() 如果参数是大写字符,返回其小写,否则返回该参数

    toupper() 如果参数是小写字符,返回其大写,否则返回该参数

    10 、wchar_t 和C++11新增类型:char16_t char32_t

    摘自3.1.8

    wcha_t:

    wchar_t是C/C++的字符类型,是一种扩展的存储方式,主要用在国际化程序的实现中。

    wchar_t 存在的原因:

    char是八位字符类型,最多能包含256中字符,许多的外文字符集所包含的字符数目超过256个,char型不能表示。

    wchar_t数据大小:

    数据类型一般为16或者32位,不同的C/C++库有不同的规定。总之:wchar_t所能表示的字符远远多于char类型。

    wchar_t的输入输出处理:

    cin和cout将输入和输出看作是char流,因此不适合用于处理wchat类型,iostream头文件提供了wcin 和wcout用于处理输入输出流另外可以通过加上前缀L来只是宽字符常量和宽字符串。

    char16_t和char32_t:

    产生原因:

    随着编程人员日益的熟悉Unicode,类型wchar_t显然已经满足不了需求,在计算机系统上进行的编码字符和字符串编码时,仅仅使用Unicode码点显然是不够的,

    比如:如果在进行字符串编码时,如果有特定长度和符号特征的类型将很有帮助,而类型wchar_t的长度和符号特征随实现而已,因此C++11新增了类型char16_t,char32_t。

    char16_t:无符号类型,长16位,

    char32_t无符号类型,长32位

    C++11使用前缀u表示char16_t字符常量和字符串常量如:u‘L’;u“lilili”;

    C++11使用前缀U表示char32_t字符常量和字符串常量如:U'L';U"lilili";

    类型char16_t与/u00F6形式的通用字符名匹配,

    类型char32_t与/U0000222B形式的通用字符名匹配。

    前缀u和U分别指出字符字面值的类型为char16_t和char32_t。

    11、函数重载

    摘自8.4

    C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。

    void test(int tmp1, int tmp2)

    {

    std::cout << tmp1 <<std::endl;

    std::cout << tmp2 <<std::endl;

    }

    void test(double tmp1, double tmp2)

    {

    std::cout << tmp1 <<std::endl;

    std::cout << tmp2 <<std::endl;

    }

    函数的重载的规则:

    函数名称必须相同。

    参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。

    函数的返回类型可以相同也可以不相同。

    仅仅返回类型不同不足以成为函数的重载。

    C++ 是如何做到函数重载的

    C++代码在编译时会根据参数列表对函数进行重命名。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

    在C语言中,不存在函数重载,原因为以函数名来唯一区分一个全局函数。 而在c++中 以函数名+参数列表来唯一区分函数。

    12、引用

    摘自8.2

    引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。

    引用的特点:

    1. 一个变量可取多个别名。

    2. 引用必须初始化。

    3. 引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。

    总结:

    1. 不要返回一个临时变量的引用。

    2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。

    * 引用和指针的区别和联系

    1. 指针是一个实体,而引用仅是个别名;

    2. 引用使用时无需解引用(*),指针需要解引用;

    3. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。

    4. 引用必须指向有效的变量,指针可以为空。

    5. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

    6. 指针和引用自增(++)自减(--)意义不一样。

     

    7. 相对而言,引用比指针更安全。

    8. 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

    * 相同点:两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。

    指针比引用更为灵活,但是其风险也很大。使用指针时一定要检查指针是否为空(NULL),且空间回收后指针最好置零,以免野指针的发生造成内存泄漏等问题。

    #include <iostream>

    int main()

    {

    struct student{

    std::string name;

    int num;

    };

    student lily = {"andrew", 168};

    const student &ref = lily;

    student *p = &lily;

    std::cout << sizeof ref<< "= sizeof ref\n";

    std::cout << sizeof p<< "= sizeof pointer\n";

    }

    执行结果:

    16= sizeof ref

    8= sizeof pointer

    展开全文
  • C++C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于...
  • C语言C++C++与JAVA 的区别总结

    万次阅读 多人点赞 2017-10-17 15:57:34
    CC++ 的区别 C语言面向过程,重点在于算法和数据结构。程序员需要考虑,从输入到输出,是如何一步一步的进行。 当软件变得越来越复杂,代码越来越长,一个人的脑力有限,往往写到后面,就忘了前面是如何做的。...
  • C语言C++零基础到实战——大新企业内部技术免费公开课文档.doc
  • 4、c语言c++和Python-和Java优缺点 4、c语言c++和Python-和Java优缺点
  • 一个c++c的工具(cfront源码),很好的工具源代码。满足特殊人使用。
  • 2019 年第十届蓝桥杯C/C++ 省赛B组原题,适用于赛后复习。
  • C语言C++的区别到底是什么?

    千次阅读 2020-12-29 18:56:38
    C语言C++的区别是一个老生常谈的问题了,今天笔者就给大家合理的分析一下其中的区别。 1、出现时间不同 C++C的超集,也可以说CC++的子集,因为C先出现。按常理说,C++编译器能够编译任何C程序,但是CC++还是...
  • C语言C++编程学习就业前景如何?

    千次阅读 2020-07-06 09:46:55
    C/C++编程语言,作为编程行业里出现较早的编程语言,几十年来,因为语言灵活,数据结构丰富、具有结构化、平台移植力强、程序执行效率高等特点,广受关注与应用。 即使新编程语言不断涌出,智能化水平越来越高,也...
  • 1、C调用C++ 本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在 wrapper的实现文件里实现。 //------apple.h #ifndef __APPLE_H__ #define __...
  • c语言c++的相互调用

    千次阅读 2017-06-16 15:47:58
    在实际项目开发中,cc++代码的相互调用是常见的,c++能够兼容c语言的编译方式,但是c++编译器g++默认会以c++的方式编译程序,而c程序编译器gcc会默认以c的方式编译它,所以cc++的相互调用存在一定的技巧。1.c...
  • C C++-王桂林.rar

    2021-05-10 22:41:27
    包括王桂林老师零基础入门C语言C语言深度进阶之你懂C语言我不信、C++
  • 最近大一新生们刚刚结束第一个学期的学习,接踵而来的问题也越来越多,不同的学校有不同的学习节奏,但是基本上都是从C语言或者c++开始学起。现在越来越多的人对于“学习C语言还有必要吗?”这件事比较纠结。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,093,041
精华内容 837,216
关键字:

c、c++

c++ 订阅