C语言不是C++的严格子集

C语言是C++的子集吗?C++是在C语言的基础上扩展而来并包含所有C语言的内容吗?

回复:

从实用角度讲,C++属于C语言的一个超集,基本上兼容ANSI C。但是从编译角度上讲,C语言的有些特性在C++中并不支持。相反,ANSI C继承了C++的几个特性,包括原型和常量。因此,这两种语言并不是另一个的超集或子集;而且它们在一些通用构造的定义上也不同。尽管有这些不同,许多C程序在C++环境中仍能编译,而且许多最新的编译器同时提供C和C++的编译模式。但是,不要把C代码完全当做C++代码来编译,否则在遇到不兼容问题时会给程序带来错误。

C++对C语言的改进如下。

C++对数组定义进行了限制。在C语言中,初始化数组时不作数组溢出判断,这样就容易使数组没有足够大的空间存放数据而产生错误。C++对此作了一些改进,像char str[3]="Jim"这样的表达式就被认为是一个错误,但是它在C语言中是合法的。

在C++中,声明语句可以穿插于语句之间。大家知道,在C语言中,一个语句块中的所有声明必须都放在所有语句的前面,而C++去掉了这个限制,使声明语句可以穿插于语句之间。

C++对C语言的改进最主要表现在对面向对象的扩充上。C语言是一种面向过程的结构化的语言,而C++是面向对象的语言,它在C语言的基础上增加了面向对象的机制,使得C++比C语言更加完善和实用。

C++中存在而C语言中不存在的限制。

在C++中,用户代码不能够调用主函数main()函数,但是在C语言中这是可以的(但是极少出现这种情况)。

C++中对函数原型的声明是严格的,要求必须完整,而在C语言中却没有这么严格。

在C++中,由typedef定义的类型的名字不能与已有的结构名称冲突,但在C语言中却是允许的。

C++规定了更严格的类型处理,例如,当void*指针赋值给另一个类型的指针时,C++要求必须进行强制类型转换,而在C语言中则无需这么做。

C++与C语言中含义不同的特性:

C++对C语言的关键字进行了扩充,增加了至少十几个。这些关键字在C语言中可以作为标识符使用,但是如果这样的C语言代码使用C++编译器进行编译,就会产生错误信息。

在C++中,内层作用域的结构名称将会隐藏外层空间中相同的对象名,在C语言中则不会这样。

在C++中,注释可以使用"//"注释符,而在C语言中则不能使用。

点评

从总体上说,C语言是C++的前身,上面只介绍了它们的一部分不同之处。从上面的介绍可以看出,C++并没有对C语言存在的一些最基本的问题进行改进,它仍然保留了C语言的许多缺陷,而且在此基础上又堆积了大量复杂的东西。不过尽管存在着不少缺陷,C语言和C++都被广泛地使用着,这也说明了其存在的价值。

C和C++的不同之处还有很多,大家要通过实际编程来分析两者的差异,并保持警惕,避免相互使用时出现错误。

---引用:http://book.51cto.com/art/201203/326393.htm

时间: 2024-10-10 19:49:34

C语言不是C++的严格子集的相关文章

【转】写一个C语言编译器 : BabyC

[转载]此文是转载,方便以后读与学习. 原文链接:http://blog.jobbole.com/77305/ 动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可用的编译器却不是这么困难. 秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去.这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提

Warning : caught an JavaWebDeveloperException() in MobiAppAge.foward() function

今天在csdn首页看到一篇推荐文章<RethinkDB:为实时应用而生的开源数据库> 看了一段示例代码,如下: r.table(geo).get('sfo')('location').toGeojson.run(conn, callback); // result passed to callback { 'type': 'Point', 'coordinates': [ -122.423246, 37.779388 ] } 让我想起了ajax技术刚兴起的时候,有一个比较有名的javascri

值得学习作为训练思维方式的编程

从编程语言产生到现在,编程方式有了翻天覆地的改变,在fortran和c等第一代编程语言中,程序员的负担是把高层次的概念转化为代码.在现代编程语言中(以python语言作为示例),使用函数.对象.模块和库来扩展语言, 不仅仅是使程序更好, 而且会改变程序的编程方式. 编程可以理解为:用自然语言表达思想, 用数学符号处理它们, 然后写出流程图和伪代码, 最后写一个程序.翻译是必要的, 因为每种语言都提供不同的功能.自然语言是富于表现力和可读性的,伪代码更精确,数学符号是精简,编码是可执行的. 但翻译

angular2的模板语法

Angular 应用管理着用户之所见和所为,并通过 Component 类的实例(组件)和面向用户的模板来与用户交互. 从使用模型-视图-控制器 (MVC) 或模型-视图-视图模型 (MVVM) 的经验中,很多开发人员都熟悉了组件和模板这两个概念. 在 Angular 中,组件扮演着控制器或视图模型的角色,模板则扮演视图的角色. 来看看写视图的模板都需要什么.本章将覆盖模板语法中的下列基本元素 HTML 是 Angular 模板的语言.快速起步应用的模板是纯 HTML 的: <h1>Hello

犀牛书笔记(五)——语句

“使某件事发生”的一个方法是计算带有副作用的表达式.注入赋值和函数调用这些有副作用的表达式,是可以作为单独语句的,这种把表达式当做语句的用法也称做表达式语句(expression statement).类似的还有声明语句(declaration statement),声明语句用来声明新变量或定义新函数. JavaScript程序无非就是一系列可执行语句的集合.默认情况下,JavaScript解释器依照语句的编写顺序依次执行.另一种“使某件事发生”的方法是改变语句的默认执行顺序. 5.1表达式语句

Java单元测试框架 JUnit

Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一个. JUnit有它自己的JUnit扩展生态圈.多数Java的开发环境都已经集成了JUnit作为单元测试的工具. 在线Javadoc:http://ww...更多JUnit信息 最近更新: JUnit 4.12 发布,Java 单元测试框架 发布于4个月前 C++模拟测试框架 Google Mock

ADT、C和Java

第5章,数据抽象使得用户程序员在编写客户程序时,摆脱该数据类型的实现细节而仅仅关心该数据类型的接口.在计算机科学中,有一些重要的数据抽象--数据结构,应该尽早地介绍.计算机科学研究的数据结构主要有线性表.栈.队列.集合.图.树等等. 这里先谈谈<数据结构>课程与实现语言的事. <数据结构(C语言版)>严蔚敏.吴伟民是经典教材,作者在前言中清楚的说明: "全书中采用类C语言作为数据结构和算法的描述语言,在对数据的存储结构和算法进行描述时,尽量考虑C语言的特色,如利用数组的动

JavaScript 权威指南第6版 - [阅读笔记]

JavaScript 基础   Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type (2)null 是一个空值,是一个特殊对象: undefined 表示空值,它不是对象 是未定义的意思:undefined==null 返回true; (3)全局变量: 全局属性:undefined.Infinty.Nan 全局函数:isNaN()[Not a Number不是数字返回true].parseInt().e

使用SWIG将C++接口转换成Java接口

以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:Ubuntu 15.04 参考资料: ubuntu源码安装swig 利用swig转换C++接口到Java接口 SWIG3.0说明文档 编程中出现的错误: java编译时出现undefined symbol:... 此种情况大部分原因是需要在原来的C++库中添加链接某lib....so文件(undefined symbol: _ZN5boost6system15