C 语言和 C++ 的一些区别
01
C++ 更强调语言的实用性,所有的变量都可以在需要使用时再定义
C 语言中的变量必须在作用域开始的位置定义
02
C++ 不允许定义多个同名全局变量,否则编译会报错
C 语言允许重复定义多个同名全局变量,它们最终会被链接到全局数据区的同一个地址空间上
03
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
C 语言中:
const
用于定义只读变量const
局部变量在栈上分配空间,通过指针可以改变它的值const
全局变量在只读存储区分配空间,通过指针改变它的值会引起程序崩溃- C 语言中可以定义常量的只有
enum
C++ 中:
- 用字面值常量或其他
const
常量初始化的为const
常量 - 用其他变量初始化的、被
volatile
修饰的为只读变量 - 在编译期间不能直接确定初始值的
const
标识符,都是只读变量
07
C 语言中:
- 早期 C 语言编译器不会对代码进行优化,使用
register
变量可以提高代码运行效率 - C 语言中无法取得
register
变量地址
C++ 中:
- C++ 编译器有自己的优化方式,不使用
register
也可以优化 - C++ 中可以取得
register
变量的地址:当编译器发现程序中需要取register
变量的地址时,register
对变量的声明将变得无效
08
C 语言中:
- 重复定义多个同名的全局变量是合法的
- 多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上
C++ 中:
- 不允许定义多个同名的全局变量
09
C 语言中:
- const 修饰的变量是只读变量,它只是告诉编译器该变量不能出现在赋值符合的左边
- const 修饰的局部变量在栈上分配空间
- const 修饰的全局变量在只读存储区分配空间
- const 只在编译期有用,在运行期无用
C++ 中:
- 当碰见常量声明时在符号表中放入常量
- 编译过程中若发现使用常量则直接以符号表中的值替换
- 编译过程中若发现对
const
使用了extern
或者&
操作符,则给对应的常量分配存储空间(注:C++ 编译器虽然可能为const
常量分配空间,但是不会使用其存储空间中的值)
10
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
评论区