初学者疑惑:都说C++是C的扩展,那它是C的超集吗?

本文探讨了C++与C的关系,指出两者并非超集与子集的关系,而是各有特色。C++中const的含义与C不同,C++允许常量表达式在更多场景下使用。此外,C++中的无参数函数声明和名称解析规则与C有所差异,如C++不允许无参数声明的函数有隐含类型。C++中缺少C的变长数组、受限指针等特性,但C++引入了如类型推断等C中没有的特性。文章旨在为读者提供C++与C差异的清晰理解。
摘要由CSDN通过智能技术生成

 


前言

如果您不熟悉这两种语言,您可能会听到人们说C++是C的超集。如果您在这两种语言中都有经验,您就会知道这一点根本不正确。

当然,C++有许多C不具备的特性,但也有一些只有C才具备的特性。而且,也许最重要的是,有用两种语言编译的代码,但是它们可以执行不同的任务。

关于这两种语言之间的差异,有很多信息可供使用,但很多信息似乎是分散的。我想尝试为经常被忽视的细节创建一个简明的指南,并从语言标准中摘录来支持这些细节。


注意事项:

这主要是针对那些至少熟悉C或C++的人。

当我提到 C ++ 时,我指的是 C ++ 11 以上的版本,尽管本文大部分都适用于 C++ 早期的标准。 我也将引用 C ++ 17 标准 (目前 C++ 的最新标准)。

当我提到 C 时,我指的是 C99 标准,同时我也将参考 C11 标准 (目前 C 的最新标准)。

值得注意的是,许多编译器不完全兼容编程语言标准。这正是难以确定什么是标准,什么是不合规以及什么是实现定义的部分原因。如果你想要查看其他编译器的示例,我建议使用 编译器资源管理器亲自动手实践一番,对比很有趣。

一、同样的代码,用两种语言编译,但结果不同

这是我认为最重要的分歧类别。并不是所有C和C++看起来共享的东西都像它看起来的那样。

常量

什么是常量的表达?

关键词constC++中的语义含义与C中的语义不同,但它比我第一次写这篇博客文章时想象的要微妙得多。

差异归结为每种语言所允许的常数表达式。可以在编译时计算常量表达式。例如,需要对静态数组的大小进行编译时评估,如下面的示例所示,它将在C++中编译,但它是否在C中编译将被定义为实现:

1 const size_t buffer_size = 5;

2 int buffer[buffer_size];

3

4 // int main() {

5    // ...

6 // }

但是常量表达式在 C 中的表现如何呢?

在这里,我们引用 C11 标准的几个部分以阐述为什么如此实现,C11 6.6 第 6 段定义了一个整数常量表达式:

整数常量表达式应具有整数类型,并且只能具有整数常量的操作数、枚举常量、字符常量,结果为整数常量的 sizeof 表达式,以及作为强制转换的直接操作数的浮点常量。 整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数的一部分。

但什么是“整数常数”? 从 6.4.4 开始,这些是字面值,而不是变量,例如 1。

这归结为只有像 1 或 5 + 7 这样的表达式可以是 C 中的常量表达式。变量不能是常量表达式。 正如我所料,此示例在 gcc 编译编译不通过,但

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值