一、c到c++的升级

来源:互联网 发布:在美橙互联域名备案 编辑:程序博客网 时间:2024/05/14 14:31

1.c++中更强调语言的“实用性”,所有变量都可以在需要时再定义

#include <stdio.h>int main(int argc, char *argv[]){    int c = 0;    printf("Begin...\n");    for(int i=0; i<10; i++)//用到时再定义    {        for(int j=0; j<10; j++)        {            c += i * j;        }    }    printf("c = %d\n", c);    printf("End...\n");    printf("Press enter to continue ...");    getchar();      return 0;}

2.register关键字的变化:

(1). 在c语言中,register是将变量存在寄存器中,c语言中无法取得该变量的地址,但是在 c++中可以取得register变量的地址, c++编译器发现程序需要取得register变量的地址时,register对变量的声明.无效,这只是早期c++编译器的做法,现代的编译器
根本不会看register
(2). 在c++中,编译器有自己的优化方式,不使用register也可能做优化,有 register只是为了兼容c,要不要无所谓

#include <stdio.h>int main(int argc, char *argv[]){    register int c = 0;    printf("Begin...\n");    printf("&c = %08X\n", &c);//取地址    printf("End...\n");    printf("Press enter to continue ...");    getchar();      return 0;}

3.全局变量重定义的变化:

(1). c语言中可以重复定义多个同名的全局变量,这些变量最终会被链接到全局数据区的同一个地址空间
(2). c++中不允许定义多个同名的全局变量,出现二义性报错

#include <stdio.h>int g_var;int g_var = 1;//程序会报错int main(int argc, char *argv[]){    printf("Begin...\n");    printf("g_var = %d\n", g_var);    printf("End...\n");    printf("Press enter to continue ...");    getchar();      return 0;}

4.const关键字的变化:

(1). const关键字修饰的变量在c++中会变成真正常量,在c中是只读的变量,本质还是变量
(2). c++编译器对const的处理:
当碰见常量声明时在符号表中放入常量
编译过程中若发现使用常量则直接以符号表中的值代替
编译过程中若发现对const使用了extern或者&操作,则给对应的常量分配存储空间
注:虽分配存储空间,但不会使用存储空间中的值(即改变了存储空间的值也没用,编译器不会使用,只会使用符号表中的值)

例子:数组a[c+d]在c语言中会报错,但c++中不会
c++中用const修饰与#define的区别:const是由编译器处理的,会进行类型、作用域等检查,二
宏定义由预处理器处理,只是简单的替换,如define在a函数中定义,在b函数中也可以使用,但是
用const定义的则不可以。如果这都想要define,则可以在函数末尾#undefined a

#include <stdio.h>int main(int argc, char *argv[]){    const int c = 0;    int* p = (int*)&c;    printf("Begin...\n");    *p = 5;//取地址之后就会分配空间,但是会用里边的值    printf("c = %d\n", c);//p的值仍然为0    printf("End...\n");    printf("Press enter to continue ...");    getchar();      return 0;}
#include<stdio.h>void g(){    #define a 3    const b = 5;}void f(){    printf("%d", a);//不会报错,宏是由预处理器来处理的,不会进行类型和作用域的检查    printf("%d", b);//报错,const常量是由编译器处理,进行类型和作用域的检查}int main(){    f();    return 0;}

5.struct类型的加强:

(1). c语言中的struct定义了一组变量的集合,c编译器并不认为这是一种新的类型
(2). c++中的struct是一个新类型的定义声明

#include <stdio.h>struct Student{    const char* name;    int age;};int main(int argc, char *argv[]){    Student s1 = {"Delphi", 30};//注意是用student来定 义而不是用struct可以这样直接用,但在c中报错(c中还                                                               //需要另外定义结构体变量)    Student s2 = {"Tang", 30};    printf("Press enter to continue ...");    getchar();    return 0;}

6.类型的加强

(1). c++里所有的变量和函数必须有类型(返回值啊、参数的类型等等都要有)
(2). c语言中的默认类型在c++中是不合法的

如:在c语言里:
int f();表示返回值为int,接收任意参数的函数
int f(void);表示返回值为int的无参函数

c++中:
int f();和int f(void);都表示返回值为int的无参函数

7.c++中的布尔类型:

(1). c++在C语言的基础类型系统之上增加了bool,且bool可取的值只有true和false
(2). 理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占用一个bit(注意是bit不是字节),这取决于编译器的实现
(3). true代表真值,编译器内部用1来表示,false代表非真值,编译器内部用0来表示,且只能是0和1
(4). true、false、bool在c++里都是关键字了

例子:
bool a = true;
a = 3;
b = a;
结果a和b的值都是1而不是3,但是a = 0;则最后是0,说明bool只有true和false两个值
为了兼容c语言,bool也可以参与数学运算,但是会将最终得到非零值就转化为true,得到零就转换为false

8.三目运算符

(1).c语言里三目运算符不能当左值,只能当右值
(2).c++里可以既可以做左值也可以当右值,但三目运算符可能的返回值中只要有一个是常量就不可以做左值
例子:
int a = 1;
int b = 2;
(a

0 0
原创粉丝点击