C++与C语言的区别详解
01 变量定义
C++ 更强调语言的实用性,所有的变量都可以在需要使用时再定义
C 语言中的变量必须在作用域开始的位置定义
02 同名全局变量
C++ 不允许定义多个同名全局变量,否则编译会报错
C 语言允许重复定义多个同名全局变量,它们最终会被链接到全局数据区的同一个地址空间上
03 C 语言具有默认类型
C++ 中所有的标识符都必须显式声明类型
C 语言具有默认类型
例:int f() 和 int f(void) 有区别吗?如果有,区别是什么?
在 C++ 中,两者都表示返回值为
int的无参函数在 C 语言中,前者表示返回值为
int,接受任意个数、任意类型参数的函数,后者表示返回值为int的无参函数
04 结构体
C++ 中的 struct 加强为类型用于定义一种新的类型
C 语言中的 struct 只是一组变量的集合,必须通过 typedef 重命名才可以当类型用
例:
//C 语言
struct student{
int id;
};
struct student a;
//C++
struct student{
int id;
};
student a;
其中,C 语言可以使用如下方式定义别名:
typedef struct student{
int id;
} Stu;
Stu a;
05 三目运算符
在 C++ 中,当三目运算符的可能返回都是变量时,返回的是变量的引用,既可以作为右值使用,也可以作为左值使用;当三目运算符的可能返回中有常量时,返回的是值,只能作为右值使用。
在 C 语言中,三目运算符的返回值始终只能作为右值使用。
例:
//C++
((a < b) ? a : b) = 3;
06 const 相关
C 语言中:
const用于定义只读变量const局部变量在栈上分配空间,通过指针可以改变它的值const全局变量在只读存储区分配空间,通过指针改变它的值会引起程序崩溃C 语言中可以定义常量的只有
enum
C++ 中:
用字面值常量或其他
const常量初始化的为const常量用其他变量初始化的、被
volatile修饰的为只读变量在编译期间不能直接确定初始值的
const标识符,都是只读变量
07 register 关键字
C 语言中:
早期 C 语言编译器不会对代码进行优化,使用
register变量可以提高代码运行效率C 语言中无法取得
register变量地址
C++ 中:
C++ 编译器有自己的优化方式,不使用
register也可以优化C++ 中可以取得
register变量的地址:当编译器发现程序中需要取register变量的地址时,register对变量的声明将变得无效
08 同名全局变量
C 语言中:
重复定义多个同名的全局变量是合法的
多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
C++ 中:
不允许定义多个同名的全局变量
09 const 相关
C 语言中:
const 修饰的变量是只读变量,它只是告诉编译器该变量不能出现在赋值符合的左边
const 修饰的局部变量在栈上分配空间
const 修饰的全局变量在只读存储区分配空间
const 只在编译期有用,在运行期无用
C++ 中:
当碰见常量声明时在符号表中放入常量
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对
const使用了extern或者&操作符,则给对应的常量分配存储空间(注:C++ 编译器虽然可能为const常量分配空间,但是不会使用其存储空间中的值)
10 bool 类型
C++ 在 C 语言的基本类型系统之上增加了 bool 类型
参考资料:
C到C++的升级 http://t.zoukankan.com/songhe364826110-p-11517145.html
C/C++编程笔记:C语言和C++语言的 struct 对比!区别在哪里? https://blog.csdn.net/qq_42366672/article/details/107030733
C到C++的升级 https://blog.csdn.net/zhubao124/article/details/102631239
- 感谢你赐予我前进的力量

