第2课-C到C++的升级

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/qq_27513221/article/details/79824881

一、升级一

  • C++更强调语言的实用性
  • 所有的变量都可以在需要使用时再定义
int c = 0;
for(int i = 0;i <= 3;++i){
  for(int j = 1;j <= 3;++j){
    c += i * j;
  }
}

对比:C语言中的变量都必须在作用域开始的位置定义

二、升级二

register关键字请求编译器将局部变量存储于寄存器中
(备注:对于C语言中存储空间和变量类型不熟悉,可以看一下这篇博客
C变量与函数类型

  • 在C++中依然支持register关键字
  • C++编译器有自己的优化方式

    • C语言中无法获取register变量的地址
    • C++中可以取得register变量的地址
  • C++中的register关键字

C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效

早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充

三、升级三

  • 在C语言中,重复定义多个同名的全局变量是合法的
    • C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
  • 在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 = 0;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;
}

打印结果:

Begin...
c = 36
&a = 000000000062FE40
End...

此程序在C语言编译器中便无法通过,原因就在于以上的“升级”。

四、升级四

  • struct关键字的加强
    • C语言中的struct定义了一组变量的集合
    • C语言中的struct定义的标识符并不是一种新的类型
    • C++中的struct用于定义一个全新的类型
//C语言中结构体的定义
typedef struct _tag_student Student; //此时可以作为一种新的类型,但本质仍然是一组变量
struct _tag_student{
  const char* name;
  int age;
};

//C++中结构体定义
struct Student{
  const char* name;
  int age;
};

五、面试中的小问题-升级五

int f()int f(void) 有区别吗?如果有区别是什么?

  • C++中所有的标识符都必须显示地声明类型
  • C语言中的默认类型在C++中是不合法的
f(i){
  printf("i = %d\n",i);
}
g(){
  return 5;
}

问题:

  1. 函数f的返回值和参数分别是什么类型?
  2. 函数g可以接受多少个参数?

答:

  • 在C语言中
    • int f()表示返回值为int接受任意参数的函数
    • f(void)表示返回值为int无参函数 (不接受任何参数)
  • 在C++中
    • int f()int f(void)具有相同的意义
    • 表示返回值为int的无参函数

实例分析:C到C++的升级二

#include<stdio.h>

//typedef struct Student Student;
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 = {"1",2};
    Student s2 = {"3",4};
    //f(10);
    //printf("g() = %d\n",g(1,2,3,4,5));
    return 0;
}

务必注意注释位置,注释位置只能在C语言编译器下通过。原因见上解释
(附注:C++是一种强类型的语言,“++”可以理解为类型的加强面向对象特性的增加

六、总结

  • C++更强调实用性,可以在任意的地方声明变量
  • C++中的register只是一个兼容的作用
  • C++编译器能够更好地进行优化
  • C++中的任意标识符都必须显示地指明类型

猜你喜欢

转载自blog.csdn.net/qq_27513221/article/details/79824881