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. 手机看youtube的方法|一个好用的VPN

    俗话说:网络无国界.但是由于天朝的限制,我们无法访问YouTube .谷歌.twitter等一些国外网站. 这个时候我们就需要FQ.最直接有效的方法就是:VPN(虚拟专用网络). 虚拟专用网络的功能是 ...

  2. 关于web请求中 获取真实IP

    HttpRequest request = HttpContext.Current.Request; if (!string.IsNullOrEmpty(request.ServerVariables ...

  3. 【转】C#绝对新手之C#中的多线程小结

    大概有4种方法: Dispatcher.异步委托.手动多线程.BackgroundWorker,另外还有一个DispatcherTimer,是定时器. 其中Dispatcher与DispatcherT ...

  4. (转)SQLSERVER表分区的介绍(一)

    下面进入正题吧,很多时候当单张数据表的数据量比较大的时候比如千万级别条记录.上亿级别记录,如果不做优化,那么查询的效率大家清楚. 有经验的人会通过各种手段做优化,其中表分区就是其中一种手段. 个人对表 ...

  5. js知识简单归纳

    js简单的归纳 基本类型 number,string,boolean,null,undefined 组合类型 一种对象类型: object 数组 函数 对象 正则 关于函数 作用域 闭包 构造函数 原 ...

  6. WinForms 小型HTML服务器

    最近教学,使用到了Apache和IIS,闲着无聊,有种想自己写个小服务器的冲动. 在网上找了半天的资料,最后终于搞定了,测试可以访问.效果图如下: 因为只是处理简单的请求,然后返回请求的页面,所以没有 ...

  7. C++ list 类学习笔记

    双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素 ...

  8. epoll_create, epoll_ctl和epoll_wait

    参考代码 #include <iostream> #include <sys/socket.h> #include <sys/epoll.h> #include & ...

  9. html 页面 ajax 方法显示遮罩

    showLoading.css 样式: ;;list-style-type:none;} a,img{;} .overlay{;;;;;width:100%;height:100%;_padding: ...

  10. 【BZOJ 2878】 [Noi2012]迷失游乐园

    Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...