变量定义
- c++所有变量都可以在需要使用时再定义,C语言所有变量都必须在作用域开始的位置定义
register关键字
- register关键字请求编译器将局部变量存储在寄存器中
- c++中依旧支持register关键字(只是为了兼容C语言)
- c++编译器有自己的优化方法
- C语言中无法取得register变量的地址
- c++中可以取得register变量的地址(对现代编译器register形同虚设,并未放入寄存器)
全局变量
- c++不允许定义多个同名的全局变量,==C语言中重复定义多个同名的全局变量是合法的==。
- C语言中的多个同名全局变量最终会被链接到全局数据区的同一个地址空间上。
struct
- c++中的struct用于定义一个全新的类型,C语言中的struct定义了一组变量的集合,C语言中struct定义的标识符并不是一种新的类型。
//c语言
typedf struct _tag_student Student
struct _tag_student
{
const char* name;
int age;
}
//c++
struct Student
{
const char* name;
int age;
}
标识符显示声明
- c++ 中所有的标识符都必须显示的声明类型,C语言的默认类型在c++中是不合法的
- C语言中
- int f() 表示返回值为int ,接受任意参数的函数
- f(void) 表示返回值为 int 的无参函数
- c++中
- int f()和int f(void)具有相同的意义
- 表示返回值为int的无参函数
- C语言中
const
c++在c的基础上对const进行了进化处理
- 当碰到const声明时在==符号表==中放入常量
- 编译过程中若发现使用常量则直接以符号表中的值替换
- 编译过程中若发现下述情况则给对应的常量分配存储空间
- 对const常量使用了extern
- 对const常量使用&操作符
c++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
C语言中的const变量
- C语言中const变量是只读变量,会分配存储空间
- const修饰的变量不是真的常量,只是告诉编译器该变量不能出现在赋值符号的左边
- const修饰的局部变量在栈上分配空间(可以通过指针修改)
- const修饰的全局变量在只读存储区分配空间(用指针修改其内容,程序将崩溃)
c++中的const常量
可能分配存储空间
当const常量为全局,并且需要在其他文件中使用
const对象默认为文件的局部变量,和static具有相同的特性,const对象只能作用于本编译模块,但是const可以与extern连用来声明该常量可以作用于其他编译模块,即被其他文件访问。
//file1.cc extern const int bufsize=512; //定义并初始化 //file2.cc extern const int bufsize; //声明 for(int index=0;index!=bufsize;++index) { }
当使用&操作符对const常量取地址
#include <stdio.h> int main() { const int c = 0; int* p = (int*)&c; printf("Begin...\n"); *p = 5; printf("c = %d\n", c); //C语言编译器,运行结果为5. c++编译器,运行结果为0 printf("*p = %d\n", *p; //C语言编译器,运行结果为5. c++编译器,运行结果为5 printf("End...\n"); return 0; }
- c++中的const常量类似于宏定义
- const int c = 5; #define c 5
c++中的const常量在与宏定义不同
- const常量是由编译器处理
- 编译器对const常量进行类型检查和作用域检查
- 宏定义由预处理器处理,单纯的文本替换
#include <stdio.h> void f() { #define a 3 const int b = 4; } void g() { printf("a = %d\n", a); //宏定义 不会报错 //printf("b = %d\n", b); //编译报错 } int main() { const int A = 1; const int B = 2; int array[A + B] = {0}; //c语言编译器出错,c++编译器编译通过。 int i = 0; for(i=0; i<(A + B); i++) { printf("array[%d] = %d\n", i, array[i]); } f(); g(); return 0; }
三目运算符的升级
- C语言中三目运算符不能作为左值
- c++中可以将三目运算作为左值赋值
- 三目运算符只有可能返回的值都是变量才能作为左值。如果一个是常量,一个是变量,则不能作为左值。
布尔类型
- 布尔类型是c++中的基本数据类型,可以定义全局变量,常量,指针,数组等
- bool类型只有true(非0)和false(0)两个值
- c++编译器会将非0值转换为true(1),0值转换为false(0)