1、C++
- C++继承了所有的C特性
- C++在C的基础上提供了更多的语法和特性
- C++的设计目标是运行效率与开发效率的统一
- (1)以C语言为基础(2)面向对象支持(3)类型、函数、异常加强
2、实用性
C++更强调语言的实用性
所有的变量都可以再需要使用时再定义
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
c += i * j;
}
}
但是在C语言中变量都必须在作用域开始的位置定义
3、register关键字
register关键字请求编译器将局部变量存储于寄存器中
- 在C++中依然支持register关键字
- C++有自己
- C语言中无法获取register变量的地址
- C++中可以取得register变量的地址
- C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
4、二义性
- 在C中,可以重复定义多个同名的全局变量
- 在C++中,不允许定义多个同名的全局变量
- C中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
5、struct关键字
- C语言中的struct定义了一组变量的集合
- C语言中struct定义的标识符并不是一种新的类型
- C++中的struct用于定义一个全新的类型
//c中结构体的定义
typedef struct _tag_student Student;
struct _tag_student
{
const char* name;
int age;
}
//C++中结构体的定义
struct Student
{
const char* name;
int age;
}
上述2端代码是C与C++中结构体的等价定义
6、默认类型
- C++中所有的标识符都必须显示的声明类型
- C语言中的默认类型在C++中是不合法的
- 在C语言中
- int f() 表示返回值为int,接受任意的参数
- f(void) 标识返回值为int的无参函数
- 在C++中
- int f()和int f(void)具有相同的意义
- 表示返回值为int的无参函数
7、const
- C语言中的const
- const修饰的变量是只读的,本质上还是变量
- const修饰的局部变量在栈上分配空间
- const修饰的全局变量在只读存储区分配空间
- const只在编译期有用,在运行期无用
- const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边
- c++语言中的const
- C++在c的基础上对const进行了进化处理
- 当碰见const声明时在符号表中放入常量
- 编译过程中若发现使用常量则直接以符号表中的值替换
- 编译过程中若发现下述情况则会给对应的常量分配存储空间
- 对const常量使用了extern
- 对const常量使用&操作符
- c++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值
- 符号表是编译器在编译程序时,内部维护的一个数据结构
C与C++中的const变量比较
- C语言中的const变量
- c语言中const变量是只读变量,会分配存储空间
- c++中的const常量
- 可能分配存储空间
- 当const常量为全局,并且需要再其它文件中使用
- 当使用&操作符对const常量取地址
- c++中的常量类似于宏定义
- const int c = 5; ==> #define c 5
- c++中的const常量在于宏定义不同
- const常量是由编译器处理
- 编译器对const常量进行类型检查和作用域检查
- 宏定义由预处理器处理,单纯的文本替换
- 可能分配存储空间
#include <stdio.h>
int main()
{
const int c = 0;
int* p = (int*)&c;
printf("Begin...\n");
*p = 5;
printf("c = %d\n", c);
printf("End...\n");
return 0;
}
上述代码在c语言中运行 , 变量c会输出5;
但是在c++语言中运行,常量c会输出0, 但是变量*p 会输出5.
#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};
int i = 0;
for(i=0; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
f();
g();
return 0;
}
上述代码中
const int A = 1;
const int B = 2;
int array[A + B] = {0};
这个代码段在C语言中是编译不通过的,因为编译器无法确定变量A与变量B的具体值;但是在c++语言中是可以编译通过的,因为编译器可以确定常量A与常量B的值,自然也就能确定array的大小。
8、BOOL类型
C++中的布尔类型
- c++在c语言的基本类型之上加了一个bool类型
- c++中的bool可取的值只有true和false
- 理论上bool只占用一个字节
- true代表真值,编译器内部用1来表示
- flase代表非真值,编译器内部用0来表示
- bool类型只有true(非0)和false(0)两个值
- C++编译器会将非0值转换为true, 0值转换为false
举例:
bool b = 0;
printf("b = %d \n", b);
b++;
printf("b = %d \n", b);
b=b-3;
printf("b = %d \n", b);
上述代码会输出:
b = 0
b = 1
b = 1
因为b不管为什么值,只要它为非0,编译器都会认为它为true, 也就是1;
只要它为0,编译器都会认为它为false, 也就是0。
3、三目运算符
C++对三目运算符进行了升级。
举例:
int a = 1;
int b = 2;
(a < b ? a : b) = 3;
printf("a = %d, b = %d\n", a, b);
上述代码如果是在c编译器编译会报错,因为c中规定三目运算符不能出现在等号的左侧;
但是在c++编译器会通过,输出 a = 3, b = 2
,因为在c++语言中,在三目运算符会返回变量的情况下,会允许出现在等号左侧。
1、c语言中的三目运算符返回的是变量值,不能作为坐值使用。
2、c++中的三目运算符可直接返回变量本身,既可作为右值使用,又可作为左值使用
3、三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
网友评论