Loading... ## 全局变量检测增强 C语言代码: ```C int a=10;//赋值,当作定义 int a; //没有赋值,当作声明 int main() { printf("a = %d\n",a); return EXIT_SUCCESS; } ``` 次代码在c++下编译失败,在c下编译通过。 <div class='album_block'> [album type="photos"] ![C](https://blog.fivk.cn/usr/uploads/2021/04/212990202.png) ![C++](https://blog.fivk.cn/usr/uploads/2021/04/1530340488.png) [/album] </div> 因为在C语言里面第二个int a;就算没写extren默认使声明,但是在c++里面声明必须加extern。 ![extern](https://blog.fivk.cn/usr/uploads/2021/04/1093687347.png) <div class="tip inlineBlock success"> C++的编译器对于全局变量的声明和定义有严格的区分,检测会增强。 </div> C语言下的全局变量的声明和定义: ```C #include<stdio.h> int a = 10;//赋值,当作定义 int a; //没有赋值,当作声明 extern int a;//和上一行一样 int main() { printf("a = %d\n", a); return 0; } ``` C++语言下的全局变量的声明和定义: ```C++ #include<iostream> using namespace std; int a = 10;//赋值,当作定义 int a; //报错 extern int a; //声明 int main() { printf("a = %d\n", a); return 0; } ``` ## C++中的所有变量都和函数名必须有类型 C语言中的函数的形参类型可以不写,void类型可以有返回值,实参的个数不做检测,而C++中形参必须有类型,返回值和实参个数做检测。 ![](https://blog.fivk.cn/usr/uploads/2021/04/4160284334.png) ```C #include<stdio.h> void fivk_cn(x, y) //形参没有类型 { printf("%d %d", x, y); return 100; //没有返回值,但是还是返回了 }; int main() { fivk(1, 2); fivk(1, 1, 1); fivk(1);//实参与形参个数不一致 return 0; } ``` ## 更严格的类型转换 C++中,不同类型的变量一般是不能直接赋值的,需要相应的强制转换。 C语言代码: ```C typedef enum COLOR { GREEN, ERD, YELLOW }color; int main() { color mycolor = GREEN; mycolor = 10; printf("mycolor:%d\n", mycolor); char* p = malloc(10); //malloc 返回void*类型地址,但C能直接用其他类型指针接。 return 0; } ``` 以上C语言代码C编译器编译可通过,C++编译器无法编译通过。 ![i](https://blog.fivk.cn/usr/uploads/2021/04/1641276204.png) 一般的void*可以介绍任何类型指针,其他的,只能接收相同类型的指针。 --- * [ ] void* = int* * [ ] int*=void* * [X] int*=int* --- ## struct类型增强 在C++中使用结构体定义类型时,可以不写struct关键字。 ![](https://blog.fivk.cn/usr/uploads/2021/04/1425446458.png) ## 新增bool类型关键字 * 标准C++的bool类型有两种内建的常量true(转换位整数1)和false(转换为整数0)表示状态,这三个名字都是关键字。 * bool类型只有两个值,true(1值),false(0值) * bool类型占1字节大小 * 给bool类型赋值时,非0值会自动转换为true(1值),0值会自动转换为false(0值) ```C++ #include<iostream> using namespace std; void fivk() { cout << sizeof(false) << endl; //为1,bool类型占一个字节 bool fLag = true; //C语言中没有这种类型 fLag = 100; //给bool类型赋值时, //非0值会自动转换为true(1),0值会自动转换为false(0) } ``` C语言中也有bool类型,在c99标准之前是没有bool关键之,c99标准已经有bool类型,包含头文件,stdbool.h就可以使用和C++一样的bool类型。 ## 三目运算符的增强 C++中的三目运算符表达式返回的是一个变量,C语言中返回的是一个常量。 ![](https://blog.fivk.cn/usr/uploads/2021/04/693134809.png) <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-005e192ec3cc21a2821d12eb5416127197" aria-expanded="true"><div class="accordion-toggle"><span style="">C</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-005e192ec3cc21a2821d12eb5416127197" class="collapse collapse-content"><p></p> ```C #include<stdio.h> int main() { int a = 10; int b = 20; printf("%d", a < b ? a : b);//10 (a < b ? a : b) = 100;//报错 //在C语言三目运算符返回的是变量的值 //值(是一个常量) = 100,报错 //要想和右边的地8行一样我们可以 *(a < b ? &a : &b) = 100; //这里返回&a的值也就是地址 printf("%d", a); return 0; } ``` <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-032a8290701dfd675c33ce19d2f35702100" aria-expanded="true"><div class="accordion-toggle"><span style="">C++</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-032a8290701dfd675c33ce19d2f35702100" class="collapse collapse-content"><p></p> ```C++ #include<iostream> using namespace std; int main() { int a = 10; int b = 20; cout << (a < b ? a : b) << endl;;//10 (a < b ? a : b) = 100; //在C++三目运算符返回的是变量 //显然,这里返回变量a cout << "a = " << a << endl; return 0; } ``` <p></p></div></div></div> ## C++中的const 在C语言中的const: <div class="tip inlineBlock success"> * const修饰的局部变量,保存在栈区。 * const修饰的全局变量,保存在常量区。 </div> 1. const修饰的局部变量,存在栈区,虽然不能通过const修饰的变量区修改栈区内容,但是可以通过地址区修改。 2. const修饰的全局变量,存在常量区,不能通过变量名和地址修改常量区的值。 3. const修饰的全局变量想在其他文件使用,直接extren声明 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-6e8495308f1b6af9a2d30420f744245068" aria-expanded="true"><div class="accordion-toggle"><span style="">C</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-6e8495308f1b6af9a2d30420f744245068" class="collapse collapse-content"><p></p> ```C #include<stdio.h> const int b = 10; //const修饰的全局变量,保存在常量区。 int main() { const int a = 10; //const修饰的局部变量,保存在栈区。 //a=12; //不能改报错 int* pa = &a; *pa = 100; //b=12; //不能改报错 int* pb = &b; *pb = 100;//不能修改常量区的值 printf("%d", a); } ``` <p></p></div></div></div> ### 在C++语言中const: <div class="tip inlineBlock success"> * C++中const修饰的局部变量,保存在符号表中。 * C++中const修饰的全局变量,保存在常量区中。 * C++中const修饰的全局变量,默认时内部属性。 </div> 1. const修饰的局部变量赋值为常量时,保存在符号表中,修改不了,是一个常量。 2. const修改的全局变量保存在常量区,不能被修改。 3. const修改的变量属于内部属性,在定义的前面加上extren修饰变成外部属性。 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-4cec09514981d83e4927bcaa51fead4f69" aria-expanded="true"><div class="accordion-toggle"><span style="">C++</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-4cec09514981d83e4927bcaa51fead4f69" class="collapse collapse-content"><p></p> ```C++ #include<iostream> using namespace std; const int b = 10; //const修饰的全局变量,保存在常量区。 int main() { const int a = 10; //C++中,const修饰的局部变量,保存在符号表中。 //a=12; //不能改报错 int* pa = (int*)&a; //对const修饰的局部变量取地址 编译器会产生一个临时变量来保存a的地址 //即 int tmp=a; int *p=&tmp; //&a == const int*,pa == int* //我们需要类型转换 *pa = 100; //a的值不会改变 //b=12; //不能改报错 int* pb = (int*)&b; *pb = 100;//不能修改常量区的值 } ``` <p></p></div></div></div> <div class="tip inlineBlock error"> 注意:int 和 const int 地址初始化时要强强制转化 <div class='album_block'> [album type="photos"] ![](https://blog.fivk.cn/usr/uploads/2021/04/3354692973.png) ![](https://blog.fivk.cn/usr/uploads/2021/04/1677546921.png) [/album] </div> </div> ### C和C++中的const异同 * 相同点:C和C++中的const修饰的全局变量都是保存在常量区,不能被修改。 * 不同点: 1. C语言中const修饰的局部变量赋值为常量时,局部变量是保存在栈区 2. C++中const修饰的局部变量赋值为常量时,局部变量保存在符号表中,不能被修改 3. C++中const修饰的局部变量赋值为变量时,局部变量存放在栈区,可通过指针修改。 4. C语言中const修饰的全局变量默认是外部链接属性 5. C++中const修饰的全局变量默认是外部链接属性 6. C++中对const修饰的局部变量为常量的变量取地址,会分配一个临时的空间。 <div class="tip inlineBlock success"> 只有const修饰的局部变量被赋值为常量时,这个局部变量保存在符号表中。 </div> 最后修改:2021 年 04 月 08 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏