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
C语言不是C++的严格子集的更多相关文章
- R语言学习笔记:取数据子集
上文介绍了,如何生成序列,本文介绍一下如何取出其数据子集 取出元素的逻辑值 > x<-c(0,-3,4,-1,45,90,5) > x>0 [1] FALSE FALSE T ...
- JavaScript 权威指南第6版 - [阅读笔记]
JavaScript 基础 Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type (2)n ...
- 证明与计算(1): Decision Problem, Formal Language L, P and NP
0x01 从判定问题到形式语言 这篇讲知识证明的wiki([1]): https://en.wikipedia.org/wiki/Proof_of_knowledge 里面有一句话: Let x be ...
- Metal并行计算以及Metal程序的命令行编译
本来Cuda用的挺好,为了Apple,放弃Cuda,改投OpenCl.好不容易OpenCl也算熟悉了,WWDC2018又宣布了Metal2,建议大家放弃OpenCl,使用Metal Performan ...
- angular2的模板语法
Angular 应用管理着用户之所见和所为,并通过 Component 类的实例(组件)和面向用户的模板来与用户交互. 从使用模型-视图-控制器 (MVC) 或模型-视图-视图模型 (MVVM) 的经 ...
- Java单元测试框架 JUnit
Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...
- Angular快速学习笔记(3) -- 组件与模板
1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性. 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表 ...
- 是时候用Coffeescript了
CoffeeScirpt是什么? CoffeeScript是一门小巧的语言脚本语言,会编译为JavaScript,并且CoffeeScript产生的JavaScript是可以通过JavaScript ...
- C++ Programming with TDD之二:CppUTest单元测试
在之前一篇C++ Programming with TDD博客中,我带给大家gmock框架的简介(地址戳着里),今天我们继续本系列,带个大家C++中的单元测试框架CppUTest的介绍. CppUTe ...
随机推荐
- (转)Tomcat内存设置
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...
- AngularJS 的那些内置九种过滤器
ng内置了九种过滤 1. currency (货币处理) 使用currency可以将数字格式化为货币,默认是美元符号,你可以自己传入所需的符号,例如我传入人民币: {{num | currency : ...
- 页面get请求 中文参数方法乱码问题
对于get方式,请求参数中存在中文,可以使用下面的方法进行处理: 两次使用encodeURI()方法:例如:encodeURI(encodeURI(“中文”)),然后再服务器中使用URLDecoder ...
- Windows VC++常见问题汇总
1.warning C4996: 'setmode': The POSIX name for this item is deprecated. Instead, use the ISO C++ con ...
- ubuntu 12.04 clang 3.4 安装
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4137402.html 1.添加clang源 deb http://llvm.org/apt/ ...
- Jquery 禁用 a 标签 onclick 事件30秒后可用
<a href="javascript:;" id="sendToTel" >发送短信</a> <script type=&quo ...
- struts2中的常量
struts2中的常量: 在:struts2-core-2.1.8.1\org\apache\struts2\default.properties 文件里 <!-- 配制i18n国际化--> ...
- UserControl eventhander 注册问题
1. 如果主页面调用UserControl来画界面 2. UserControl局部变化需要通过事件通知主页面,通过UserControl定义EventHandler,主界面注册UserControl ...
- 从 Typecho 自定义字段的调用代码看去
千呼万唤,Typecho 的"自定义字段"功能终于在 0.9 中出来了.然而,多数人还蒙在这样一个鼓里--该怎么在模板调用已经设置好的自定义字段呢?让我们从这里开始说下去: Typ ...
- 1018. Public Bike Management (30)
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...