标签:har 符号表 out 说明 eof 左值 开始 匿名 temp
我们都知道c++是完全兼容c的,而且对c做了一定的优化。
c++与c的不同在于:
1.实用性的增强:变量可以任意定义了
在c中:变量的定义必须在函数使用之前,不然在有些早期的编译器中可能出错。
int i = 0; for (i = 0; i < 10; i++) { }
//int b;//error
在c++中:变量可以任意定义,不过要注意变量的作用域和生存周期。
for (int i = 0; i < 10; i++) { //***这里的i随for循环的结束而被释放 int temp=1; }
int b=2;
2..对全局变量检测能力的增强:不允许有重定义的现象出现
在c++中:一个变量不管是声明还是定义只能出现一次
//int g_val;
//int g_val=10;
//这样定义在C语言不会报错,但在c++中会出错
3.对struct增强
在c中
struct teacher { int id; char name[64]; }; void test2() { //在c语言中只能struct teacher t;这样定义除非加上typedef //而在c++可以这样: //teacher t; }
4.对函数检测增强
c++中对形参传递,返回值做了严格的检查,不允许任意传,任意调用,必须有返回值。
而在c则可以任意,不过一般按照规范去写。
void f(int i) { cout << i << endl; } void test3() { f(1); //在c中这样不会报错(warning),而在c++中这样会报错(error)。 //f(1, 2, 3); }
5.新增bool类型
在C语言中:非0代表真,0代表假
int flag =1;//真 int flag=-1;//真 int flag=0;//假
在c++中新增了一个bool变量,bool变量的值只有0或1.
bool flag = true; flag = false;//true--真,false--假 cout << "bool的size="<<sizeof(flag) << endl;//1个字节 cout << "flag=" << flag << endl;//为true值为1,为false值为0,不管为bool类型赋非0值则为1(true),bool值只有0/1
6.对三目运算符的增强
在c中:a > b ? a : b = 30一般会编译出错。原因是a > b ? a : b返回的是10,10=30会出错
而在c++:a > b ? a : b返回的是对b的引用。
不过要注意:a > b ? a : b作为左值时返回的结果不能有常量(常量不能取地址)。做右值时任意
//c中: void test5() { int a = 10; int b = 20; int max = a > b ? a : b; printf("%d\n",max); //c++: a > b ? a : b = 30;//在c中这个会出错20=30没有意义,在c++中可以使用a > b ? a : b 返回b变量的引用*(a>b?&a:&b)=30 cout << "b=" << b << endl;//30 //a > b ? 10 : b = 30;//error,作为左值时返回的结果不能有常量(常量不能取地址)。做右值时任意 }
7.const增强
在c中:
1)const并不是一个常量,是一个变量加了只读属性.
2)const int 和int const是一样的。
3)const修饰的变量实际上是可以通过指针改变的。是一个假的常量
int const a = 1; const int b=1; int *p = (int*)&a; *p = 20;
4)与#define是有区别的。#define在预编译时处理,const在编译时处理。
在c++中:
1)const修饰表示的就是常量。
const int a=1;这在c++中并不会在栈空间中开辟空间,而在内存中会有一个符号表去记录key---value.
2)a实际上是一个符号,是不能去访问地址的,但c++发现对一个const常量符号取地址时,会临时在栈上开辟一个临时空间,这个变量是匿名的。p-->临时变量
*p改变的是临时变量,而不是常量a.
3)const做参数使用:
const teacher *t:const teacher指针可动,指针指向的常量不可变
teacher * const t:teacher * const指针不可动,指针指向的常量可变
const teacher * const t:指针不可动,指针指向的常量不可变
说明图:
void change_teacher1(teacher *t) { t->id = 10; } void change_teacher2(const teacher *t) { //t->id = 10;//此时t指向的一个区域为常量不能被修改 teacher t2; t = &t2; } void change_teacher3(teacher *const t) { t->id = 10; //teacher t2; //t = &t2;//t是一个常量指针,不能修改 } void change_teacher4(const teacher *const t) { //t->id = 10;//此时t指向的一个区域为常量不能被修改 //teacher t2; //t = &t2;//t是一个常量指针,不能修改 }
8.enum的增强
在c++中不用在使用enum的值直接给enum变量赋值了。
enum num { a=0,//从0开始累加,不写默认为0开始. b, c, d }; void test8() { enum num n = a; /*n = 0; n = 1; n = 2; n = 3;*/ //在c语言中给枚举类型赋值时,可以通过枚举值赋值,而在c++中不可以 }
标签:har 符号表 out 说明 eof 左值 开始 匿名 temp
原文地址:https://www.cnblogs.com/knight11/p/9763884.html