1.register关键字的加强

register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度,这只是一种请求,编译器可以拒绝这种申请。

(1)register变量必须是能被CPU所接受的类型。

这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。寄存器的位数通常和cpu的位数一致。现在32bit和64bit的cpu居多。

(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址(c++中可以取地址)。

(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。

在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。

(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a;

(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。尤其现代编译器更加智能了,一般情况下不需要我们主动使用寄存器变量。

c:

c++:

为什么c++可以对寄存器变量取地址呢?

c++编译器在遇到对寄存器变量取地址的时候,会忽略你的register请求。

2.变量检测加强

全局变量:

int a;

int a=1;

C语言中可以编译通过(而且没有任何警告),c++中是不允许的。C语言中只有当同名全局变量都赋予初始值时,才会报错,例如:

int a=1;

int a=1;

所以,c++中对变量检测更为严格了。

3.const的加强

在之前的随笔中已经说过了,C语言的const不是常量,c++中的是常量。c++中,const修饰的变量放在符号表中,哪怕指针强制类型转换,也不能更改const修饰的变量的值,这已经是真正的常量了。

4.三目运算符的加强

C语言中三目运算符表达式不能作为左值,但是c++中是可以的。

5.struct关键字的加强

这就自然不用多说了,类是c++的特色之一,这个就不多说了。做个测试,说明c++的struct和C语言的struct定义“结构”时的不同。

6.对函数返回值和参数检测加强

c语言有一些历史遗留问题,函数可以不带返回值,参数还可以不声明类型,但是在c++中是不允许的,C语言中我们也应该规避掉那样的写法。

C语言函数形参不写,代表一切,c++中函数形参不写,代表void。

随机推荐

  1. sleep() 和 wait() 有什么区别?

     sleep:Thread类中定义的方法,表示线程休眠,会自动唤醒: wait:Object中定义的方法,需要手工调用notify()或者notifyAll()方法. sleep是线程类(Thread ...

  2. BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)

    题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...

  3. [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树

    [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...

  4. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...

  5. Linux.Centos.yum命令的“No module named yum”错误

    Centos版本: uname -a Linux ygpiao -.el6.x86_64 # SMP Tue Jun :: UTC x86_64 x86_64 x86_64 GNU/Linux 在一次 ...

  6. 继承之super关键字的使用

    一.super关键字: 在对象的内部使用,可代表父类对象. 1. 访问父类的属性:super.age 2. 访问父类的方法:super.eat() 例: package 关键字extends; pub ...

  7. python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...

  8. 把tree结构数据转换easyui的columns

    很多时候我们的datagrid需要动态的列显示,那么这个时候我们后台一般提供最直观的数据格式tree结构.那么需要我们前端自己根据这个tree结构转换成easyui的datagrid的columns. ...

  9. EF迁移命令

    EF迁移设置的最后一步是在包管理器控制台中输入命令“add-migration InitialMigration -IgnoreChanges”.“InitialMigration”(高亮的黄色)是您 ...

  10. document.domain 实现跨域

    该方式只能用于二级域名相同的情况下,比如 a.test.com 和 b.test.com 适用于该方式. 只需要给页面添加 document.domain = 'test.com' 表示二级域名都相同 ...