001-02 各种增强
实用性增强 - 变量可以在任意地方定义
#include "iostream"
using namespace std;
//C语言中的变量都必须在作用域开始的位置定义!!
//C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
int main11()
{
int i = 0;
printf("ddd");
int k;
return 0;
}
变量检测增强 - 可出现同名全局变量
-
在C语言中,重复定义多个同名的全局变量是合法的
。多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
-
在C++中,不允许定义多个同名的全局变量。
C++直接拒绝这种二义性的做法。
int g_var;
int g_var = 1;
struct类型的加强 - struct关键字定义的就是类型
-
C语言的struct定义了一组变量的集合。
C编译器并不认为这是一种新的类型
-
C++中的struct是一个新类型的定义声明
C++中所有的变量和函数都必须有类型 - 变量和函数(返回值以及参数)都要都返回值
- C++中所有的变量和函数都必须有类型
- C语言中的默认类型在C++中是不合法的
在C语言中
int f(); //表示返回值为int,接受任意参数的函数
int f(void); //表示返回值为int的无参函数
在C++中
int f();
int f(void); // 都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
新增Bool类型关键字
C++中的布尔类型
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false
三目运算符增强 - 能当左值
1)
C语言返回变量的值 ;C++ 语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用;
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,如下:
(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
====>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
==思考:如何让C中的三目运算法当左值呢?==
register 关键字的增强
c 语言中的register关键字
(1)register变量必须是能被CPU所接受的类型。
这通常意味着register变量必须是一个单个的值
并且长度应该小于或者等于整型的长度
不过,有些机器的寄存器也能存放浮点数。
(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。
此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。
(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
注意:
早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。
//register关键字请求编译器让变量a直接放在寄存器里面,速度快
//在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容
C++中register关键字的变化
- register关键字请求“编译器”将局部变量存储于寄存器中
- C语言中无法取得register变量地址
- 在C++中依然支持register关键字
- C++编译器有自己的优化方式,不使用register也可能做优化
- C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。