我们之前学习了那么多的 C 语言相关的知识,其实 C 语言是在实践的过程中逐步完善起来的。C 语言在设计之初就是对 B 语言进行改良,使其能够直接产生机器码,C 语言由此诞生。后来 Unix 操作系统开始用 C 语言重写,同时 C 语言在实践的过程中也得到了发展。但是它没有经过深思熟虑的设计过程,残留了过多的低级语言的特征。C 语言的目标是高效,最终程序执行效率的高效。

        

        本系列博客内容是根据狄泰软件学院的嵌入式c++语言课程深度解析视频培训教程  的内容总结而来,狄泰技术交流群:199546072


        那么 C++ 继承了所有的 C 特性,在 C 的基础上提供了更多的语法和特性,C++ 的设计目标是运行效率与开发效率的统一。C++ 更强调语言的实用性,所有的变量都可以在需要使用时再定义。那么对比 C 语言来说,它中的变量都必须在作用域开始的位置定义。就这点来说,C++已经更加强大了。C++ 的两个 + 主要体现在两方面:a> 类型的加强;b> 面向对象的支持。

        register 关键字请求编译器将局部变量存储于寄存器中,在 C++ 中依然支持 register 关键字,这是为了要兼容 C 语言的特性。在 C++ 编译器中,它有自己的优化方式,C 语言中无法获取 register 变量的地址,但在 C++ 中可以获取到 register 变量的地址。C++ 编译器发现程序中需要获取 register 变量的地址时,register 对变量的声明变得无效。

        在 C 语言中,重复定义多个同名的全局变量是合法的,但在 C++ 中,不允许定义多个同名的全局变量。因为在 C 语言中的多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。在 C++ 中直接拒绝这种二义性的做法!

        下来我们来以代码为例进行分析

#include <stdio.h>

int g_v;
//int g_v;

int main(int argc, char *argv[])
{
    printf("Begin...\n");
    
    int c = 0;
    
    for(int i=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            c += i * j;
        }
    }
    
    printf("c = %d\n", c);
    
    register int a = 0;
    
    printf("&a = %p\n", &a);
    
    printf("End...\n");
    
    return 0;
}

        我们以 C++ 的方式直接在第12行和第14行的两个 for 循环中直接定义变量 i 和 j,这样它们的作用域就是 for 循环了。直接打印 register 修饰的变量 a 的地址。看看编译结果

图片.png

        我们再把第 4 行的注释去掉,看看重复定义同名变量,它会报错吗

图片.png

        我们看到这样是不允许的。在 C++ 中,struct 关键字也得到了加强。C 语言中的 struct 定义了一组变量的集合,它定义的标识符并不是一种新的类型,但在 C++ 中的 struct 能用与定义一个全新的类型。

图片.png

        在 C++ 中所有的标识符都必须显示的声明类型,C 语言中的默认类型在 C++ 总是不合法的。在 C 语言中,int f() 表示返回值为 int,接受任意参数的函数;f(void) 表示返回值为 int 的无参函数; 在 C++ 中,int f() 和 int f(void) 具有相同的意义,都表示返回值为 int 的无参函数

        下来我们以代码为例进行分析

#include <stdio.h>

struct Student
{
    const char* name;
    int age;
};

f(i)
{
    printf("i = %d\n", i);
}

g()
{
    return 5;
}


int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}

        我们在第 3 行定义了一个结构体 Student,在 C++ 中是合法的,但是第9行和第14行的这种函数的写法是不允许的,因此它会报错。我们来看看编译结果

图片.png

        我们看到定义和使用它们的地方都出错了,我们注释掉它们再来编译

图片.png

        我们看到编译通过了,证明 struct 可以直接定义类型。

        这块有个面试的小问题:int f() 和 int f(void) 有区别吗?如果有,是什么区别?答案就是看是什么编译器了,如果是 C 语言编译器,便是有区别了。第一个表示返回值为 int 可接受任意多参数的函数,第二个是 返回值为 int 的无参函数如果是 C++ 编译器,就是没什么区别啦。

        通过对 C 到 C++ 的学习,总结如下:1、C++ 更强调实用性可以在任意的地方声明变量;2、C++ 中的 register 只是一个兼容的作用;3、C++ 编译器能够更好的进行优化,它的任意标识符都必须显示的指明类型。


        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083