关闭

一、c到c++的升级

140人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5406次
    • 积分:375
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论