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

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

  1. R语言学习笔记:取数据子集

    上文介绍了,如何生成序列,本文介绍一下如何取出其数据子集 取出元素的逻辑值 > x<-c(0,-3,4,-1,45,90,5) > x>0 [1] FALSE FALSE  T ...

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

    JavaScript 基础   Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type   (2)n ...

  3. 证明与计算(1): Decision Problem, Formal Language L, P and NP

    0x01 从判定问题到形式语言 这篇讲知识证明的wiki([1]): https://en.wikipedia.org/wiki/Proof_of_knowledge 里面有一句话: Let x be ...

  4. Metal并行计算以及Metal程序的命令行编译

    本来Cuda用的挺好,为了Apple,放弃Cuda,改投OpenCl.好不容易OpenCl也算熟悉了,WWDC2018又宣布了Metal2,建议大家放弃OpenCl,使用Metal Performan ...

  5. angular2的模板语法

    Angular 应用管理着用户之所见和所为,并通过 Component 类的实例(组件)和面向用户的模板来与用户交互. 从使用模型-视图-控制器 (MVC) 或模型-视图-视图模型 (MVVM) 的经 ...

  6. Java单元测试框架 JUnit

    Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...

  7. Angular快速学习笔记(3) -- 组件与模板

    1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性. 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表 ...

  8. 是时候用Coffeescript了

    CoffeeScirpt是什么? CoffeeScript是一门小巧的语言脚本语言,会编译为JavaScript,并且CoffeeScript产生的JavaScript是可以通过JavaScript ...

  9. C++ Programming with TDD之二:CppUTest单元测试

    在之前一篇C++ Programming with TDD博客中,我带给大家gmock框架的简介(地址戳着里),今天我们继续本系列,带个大家C++中的单元测试框架CppUTest的介绍. CppUTe ...

随机推荐

  1. 引用类型之Function类型

    Function类型 ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象.每个函数都是Function的实例,具有属性和方法.而重要的一点是,函数名,不过是指向函数的指针, ...

  2. css笔记——区分css3中的transform transition animation

    出处:http://blog.csdn.net/dyllove98/article/details/8957232   CSS3中和动画有关的属性有三个  transform. transition  ...

  3. JetBRAINS 系列注册机

    转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/1118/ 说明 这个是一国外的大牛写的一个 JetBRAINS 系列注册机,他里面包含了很多,我就不打字了. ...

  4. Open Live Writer增加代码插件

          作为一名程序员,免不了和代码打交道,自然在写博客的时候,也会用到代码的展示,Open Live Writer确实是一个不错的工具,不用再去登录博客的后台,就可以在本地进行文章的编写,但是致 ...

  5. Java多线程(一) 多线程的基本使用

    在总结JDBC数据库连接池的时候,发现Java多线程这块掌握得不是很好,因此回头看了下多线程的内容.做一下多线程模块的学习和总结,稳固一下多线程这块的基础.关于多线程的一些理论知识,这里不想啰嗦太多, ...

  6. Linux C 程序 获取目录信息(16)

    4.获取当前目录getcwd 会将当前工作目录绝对路径复制到参数buf所指的内存空间5.设置工作目录chdir6.获取目录信息opendir打开一个目录readdir读取目录中的内容  读取目录项信息 ...

  7. Jquery mobile 学习笔记

    最近学习移动开发,接触到了phonegap,然后又需要开始学习jquery mobile.掌握两者是开发轻应用的前提 在学习jquery mobile中,遇到了许多问题让初学者很是头疼,无意间找到这个 ...

  8. YII千万级PV架构经验分享--理论篇

    hello,大家好,我是方少,现在想象一下这样一个情景,这是一个很惬意的季节,是一个可以随意乱穿的季节,两个人,一个穿羽绒服,一个穿热裤,小胡同里两人迎面走来,看到对方都哈哈大笑,前仰后合,笑完都甩一 ...

  9. scala知识点(一)

    1.drop,dropRight,dropWhile drop: drop(n: Int): List[A] 丢弃前n个元素,返回剩下的元素 dropRight: dropRight(n: Int): ...

  10. win10 安装scrapy

    在win10的环境下安装scrapy,并不能直接按照官网的手册(http://doc.scrapy.org/en/1.0/intro/install.html)一次性安装成功,根据我自己的安装过程中遇 ...