一、闲说C

C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。

1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。并且他用B语言写了第一个UNIX操作系统。

1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。

C语言非常简洁,只有32个关键字,9种控制语句,34种运算符。

具体来说,C语言是一个结构化语言,重点在于数据结构和算法的实现。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。

C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。

C 语言是非常有效率的,很多时候你都需要考虑内存的管理等底层的东西。很可惜这些都需要你去花很多的时间去做。作为一种底层编程语言,可以通过指针进行很直接的内存管理,另外,很多语言都是用 C 来设计的, 比如 perl , java, python。

C语言是一种通用性的编程语言,它既具有高级语言的特点,又具有汇编语言的特点。,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。尽管C语言是为实现操作系统软件而设计的,但它也广泛的应用于开发便携式应用软件。

代码:

 #include<stdio.h>
int main(void)
{
printf("hello, world!n");
return ;
}

二、闲说C++

20世纪70年代中期,Bjarne Stroustrup在剑桥大学计算机中心工作。他使用过Simula和ALGOL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植,是Bjarne Stroustrup的初衷。以C为背景,以Simula思想为基础,正好符合他的设想。1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年该语言被正式命名为C++。

由此可见,C++是C的继续和发展。C++功能强大,可以因应开发大型应用软件。即可以面向对象,也可以兼容C,可以面向过程。

C++是一种复杂、难以掌握的语言,不仅体现在其语法,更体现在其提供了4种编程思维模型上面,包括:procedural-based, object-based, object-oriented, generic paradigm。由此C++是既有效率,又有弹性;既可以面向对象,又兼容面向过程。

C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。

C++是最流行的编程语言之一,它的应用领域涵盖了系统软件、应用软件、驱动程序、嵌入式软件、高性能的服务器与客户端应用程序和诸如电视游戏等娱乐软件。

代码:

 #include<iostream>
using namespace std;
int main()
{
cout << "Hello, world" << endl;
return ;
}

三、C和C++的联系与区别

面向过程的思路:分析解决问题所需的步骤,用函数把这些步骤依次实现。

面向对象的思路:把构成问题的事务分解为各个对象,建立对象的目的,不是完成一个步骤,而是描述某个事务在解决整个问题步骤中的行为。

从上述描述可以看出,其实面向对象和面向过程是两种思考解决问题的方式,其差异主要在于思考的角度。

C语言是面向过程的编程,它最重要的特点是函数,通过main函数来调用各个子函数。程序运行的顺序都是程序员事先决定好的。

C++是面向对象的编程,类是它的主要特点,在程序执行过程中,先由主main函数进入,定义一些类,根据需要执行类的成员函数,过程的概念被淡化了(实际上过程还是有的,就是主函数的哪些语句),以类驱动程序运行,类就是对象,所以我们称之为面向对象程序设计。面向对象在分析和解决问题的时候,将涉及到的数据和数据的操作封装在类中,通过类可以创建对象,以事件或消息来驱动对象执行处理。

C语言和C++的最大区别在于它们解决问题的思想方法不一样。C语言主要用于嵌入式领域,驱动开发等与硬件直接打交道的领域, C++可以用于应用层开发,用户界面开发等于操作系统打交道的领域。

C++既继承了C强大的底层操作特性,又被赋予了教科书式的面向对象机制。它特性繁多,有其他面向对象语言鲜见的多继承,有耐人寻味的对值传递与引用传递入木三分的区分以及const关键字,等等。C++就像是一把瑞士军刀,或者像是一个工具箱,它为你提供尽可能多的工具,多到让不熟悉它的人无所适从,让懂得如何使用它的人如鱼得水。C++的种种特性使得它非常适合用来编写底层数据结构,算法,库等,是系统软件开发以及数学模型构建等的强大武器库,被誉为工业级编程语言。

C++对C的“增强”,表现在以下几个方面:

类型检查更为严格。增加了面向对象的机制。增加了泛型编程的机制(Template)。增加了异常处理。增加了运算符重载。增加了标准模板库(STL)。增加了命名空间,避免全局命名冲突。

四、C++与C不兼容之处

C的大部分代码在C++上都能应用,而C++的代码在C上不能应用。(记住是大部分,不是所有)

C++是C语言的超集,虽然C++兼容C,但是C++中也有与C语言中不兼容的地方。

4.1 变量声明的位置

C中变量声明和代码是分开的,必须在函数开始处声明;

C++中,变量可以在任意处声明,只要保证先声名后使用的原则就可以。

4.2 struct结构体方面

用struct定义变量

struct mystruct{ int i;float x;

在c中声明struct变量要这么写:struct mystruct a;

在C++中前面不用加struct:mystruct a;

一种兼容的用法是:

typedef struct _mystructint i;float x;} mystruct;

然后用mystruct 定义变量。枚举型(enum),联合体类型(union)也是同样。

在C++中,struct结构体支持成员函数的定义,C中不行。另外要注意的是,C++中成员函数的默认访问说明符为public,这一点和类不同,类的默认访问说明符为private.

4.3 bool类型值

C++中有bool(或boolean类型);C中可没有这样的bool类型,均为数值类型!需要注意的是真为非零(如:1,52,-5,-2等),假的数值为0。

4.4 注释的不同

C中的注释至有一种 /*......*/;

C++中的注释包含两种/*......*/和//。

4.5 强制数据类型装换

C中的强制转化形式为:(类型)变量;

C++中还可以使用:类型(变量)的形式。

4.6 赋值

C语言中的赋值只有一中即:=;

C++中除了使用=外,还可以使用()。例如:int x(5);就等于: int x=5;我想这种写法是给C++中对象初始化时初始化属性是对象时使用的,那么对于基本类型也可以使用了。

4.7 函数

C语言中函数没有参数默认值,在C++中函数有参数默认值的概念,注意参数默认值与函数重载的区别。

C语言中函数的定义又两种形式,经典形式和标准形式,C++中只支持标准形式。

标准形式:int string(int x,float y){......}

经典形式: int string(x,y)int x;float y;{......}

C++的函数必须先声名原型或定义才能使用,因为C++是强数据类型语言,在C语言中,未声名和定义函数之前调用函数是允许的.

4.8 运算符&和关键字const

&运算符最基本的含义是取地址,C和C++中都支持这一语法。但在C++中&还可以表示引用。有了引用的概念后函数调用可以作为左值。例如:

int &rtux()......rtux()=5;

以上表达式在C++中完全正确,但在C语言中是非法的。

const关键字要注意一点不同的就是在C++的类函数中,函数可以声名是可以用const,表示这个函数没有改变类中的任何属性。如:void unchange()const;C不能有这样的生明。

4.9 extern说明符

在C语言的某些版本中,可以在程序中多次使用一个全局变量而无需使用extern说明符。但在C++中除定义全局变量外,在其他模块使用应先用extern生明。

4.10 void指针

在C语言中void指针可以赋给任何类型的指针,但在C++中,却不行,但可以先进行强制数据类型转换,在赋值。

作者:耑新新,发布于  博客园

转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

浅谈C、C++及其区别、兼容与不兼容的更多相关文章

  1. [转]浅谈Hive vs. HBase 区别在哪里

    浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...

  2. 浅谈 equals 和 == 的区别

    在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...

  3. 浅谈==和equals的区别

    java中的==和equals的区别? 看上面的代码,输出的结果是: true false true true 1.为什么会有上面的区别呢?==和equals比较的到底是什么呢? 搞清楚两者的区别其实 ...

  4. 浅谈Sass与Less区别、优缺点

    Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...

  5. 浅谈sass与less区别优缺点

    Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...

  6. 浅谈 unix, linux, ios, android 区别和联系

    浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux   UNIX 操作系统(尤尼斯) ...

  7. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  8. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  9. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  10. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

随机推荐

  1. Docker多主机网络 OpenvSwitch

    一.Open vSwitch    Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...

  2. P4888 三去矩阵

    P4888 三去矩阵 给出一个字符矩阵, 多次询问求以 \((x, y)\) 为中心的最长回文串长度(即横竖两种) \(l, q <= 2000\) Solution 数据范围小直接模拟即可 C ...

  3. 题解 P2486 【[SDOI2011]染色】

    写在前面 对于刚学树剖的同学比如我这种大大大蒟蒻来说,做这题会给你带来很大的提升:不仅可以对树剖有更深刻的理解,还可以更好的理解线段树,所以这是一道好题哦 为了更好懂,我一点一点说说思路吧 思路 首先 ...

  4. supervisor自启动

    supervisor自启动 其实自启动,也就是在主机开启的时候,执行了sudo supervisord -c /etc/supervisord.conf: 创建/usr/lib/systemd/sys ...

  5. SpringBoot + WebSocket 开发笔记

    1. 服务端的实现,我尝试了两种方式: 第一种是用“@ServerEndPoint”注解来实现,实现简单: 第二种稍显麻烦,但是可以添加拦截器在WebSocket连接建立和断开前进行一些额外操作. 不 ...

  6. Nlog写日志到数据库

    https://github.com/nlog/NLog/wiki/Database-Target

  7. Shell中eval的用法示例

    功能说明:告知shell取出eval的参数,重新运算求出参数的内容. 语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行. 参 数:参数不限数目,彼此之间用分 ...

  8. ConcrrentSkipListMap介绍和原理分析

    一.前言: JDK为我们提供了很多Map接口的实现,使得我们可以方便地处理Key-Value的数据结构. 当我们希望快速存取<Key, Value>键值对时我们可以使用HashMap. 当 ...

  9. HDU 2087 剪花布条 (KMP 不允许重叠的匹配)

    题目链接 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Inp ...

  10. flask配置日志输出文件

    1.flask可以通过日志库来指点日志输出的路径, 配置日志输出的连接:www.gaodin.com