c和c++都是在实践中发展起来的语言。实用性极强。c是与UNIX/Linux的发展相辅相成的。而C++是B.S为了摆脱c与硬件以及底层过于紧密的苦恼,而开发的语言。C++可以说就是c语言的超集。任何c语言的程序理论上都应当是合法的C++程序。
C语言的特点:过程性编程和结构化编程。函数作为编程的主要载体和任务模块。一方面用for,while,if-else为代表的分支来规划程序结构,另一方面采用自顶向下编程思想。大任务分为小任务,小任务再往下分,表现为,函数套函数。结构清晰明了。
C++语言特点:1.过程性编程 ----- 函数或者类中的方法设计与开发仍然占据重要地位。
2.面向对象编程(OOP)------以封装,继承,多态等思想为代表。主要的工作在于类的设计和实例(对象)的应用。
3.通用编程(generic programming)。------------以模板template为代表。。。实际上到现在自己也没怎么学会这个。要加油了。
一开始,C++的规范并不太一致,C则以K&R C为通用标准。后来ANSI/ISO制定了ANSI/ISO C++标准,同时制订了ANSI/ISO C标准,定义了两种语言都使用的标准C库。。从此,两种语言有了官方的标准并且不断由官方发布更新版本。
在官方标准中,C语言引进了函数原型和const类型限定符,并且支持了//注释格式。以及long long等新的整型。
今年寒假,考完研,就找了一本C++和一本C的教材,在毕(shi)业(ye)之前好好温习一下两种语言。两种语言有很多相似之处。下面总结(zhao chao)一下两种语言的相似之处.
第一条:include 的头文件。
C语言的传统是使用扩展名.h,例如math.h。C++的定位之一是C语言的拓展,所以起初C++也是以.h作为头文件后缀,而且有些C的头文件直接当作C++的头文件。
但是后来C++的标准发生改变:头文件不再使用拓展名,来自C语言的头文件,在头文件名前加上前缀c。例如:math.h --》cmath和iostream.h --》iostream 。同时,这种改变也意味着一些新的特性,比如namespace,等被加入。所以一些老旧的编译器会支持#include<iostream.h>但是不支持#include<iostream>。
头文件类型 | 约定 | 范例 | 说明 |
C++旧式风格 | 以.h结尾 | iostream.h | C++程序可以使用 |
C旧式风格 | 以.h结尾 | math.h | C,C++程序可以使用 |
C++新式风格 | 没有拓展名 | iostream | C++程序可以使用,使用namespace std |
转换后的C | 加上前缀c,没有拓展名 | cmath | C++程序可以使用,可以使用不是c的特性 |
第二条:main函数
经典C函数头: main() //original C style, omitting int
在C语言中,省略返回类型就是默认函数类型为int。。。但是,C++逐步淘汰这种用法,所以不建议省略 int 返回类型。而且不建议使用 void main()。因为部分系统可能不支持。
此外int main(void)在C和C++中都表示函数不接受任何参数。而int main()在C++中与使用void相同作用,在C中则意味着对是否接受参数保持沉默。(好吧,什么叫保持沉默。。。。)
第三条:注释风格
/*-----*/是C的注释风格,//是C++的注释风格。C99之后,C支持了//。两者在两种语言中均可混用。但是应尽量保持风格统一。
同时,应尽量使用C++注释风格,因为它不涉及到结尾符号与起始符号的匹配。有些人写了/* 就容易忘记写 */
第四条:const与 #define 定义符号常量。
编译过程中,先将源程序先交给预处理器(the preprocessor)作相应的处理。然后再编译。不是边编译,边处理。比如#include 将整个头文件替换到#include 这个语句处。#define X Y是先在源程序中查找独立的标记X,将其替换为Y。。。替换完之后再编译
c中常用#define MAX 100来定义常量。C++支持这种C风格,但是它提供了更适合的const int MAX = 100;
在头文件中必须使用#define MAX。因为const int MAX = 100.是一种定义。一个变量只能被定义一次。
使用const要注意以下规则:
- 创建常量的通用格式: 注意,声明常量时必须要初始化。而且初始化之后,常量不能进行改变。
const type name = value;
- 在头文件中尽量不要使用const,而应该使用#define。
- const可以根据C++的作用域规则将定义限定在特定的函数或者文件中。而#define则在其所在文件范围内均可见
第五条:bool类型
此处暂留,等看完if-else之后综合比较。主要观点就是经典C中没有bool类型,C++中有bool。但是自从C99之后,C可以支持bool型了。
第六条:强制转换
强制转换的通用格式:
(typename)value //C-style, both supporting
typename(value) //C++ -style, only C++ supporting
static_cast<typename> (value) //another operator for casting in C++..
第二种C++风格的想法是强制转换类似与函数调用,所以借鉴函数调用格式。value类似与传入参数,typename类似与函数名。但是,一和二一般采用C风格。。第三个是C++独有的强制类型转换操作符。
第七条:指针
在C中,将指针视为无符号整数,注意并不是int类型。。具体格式看具体编译器和操作系统的实现。而C++将指针(地址)视为一种独立的类型。所以:
//字符串常量在C和C++中编译时,表示的是字符串所在的内存地址。
char fish[] = "Bubbles"; //字符串常量初始化数组。实际上将const char * 赋值给char* 类型的fish。,alright,no pa。
char fish = “Bubbles”;
//这句话在C中能够编译通过,但是会发出警告。将指针赋值给整型变量。默认启用。
//但是在C++中。这句话是错误的。无法编译通错,会报错:不能将const char * 赋值给char类型变量。因为他们是不同的类型。
int * a = 100; //在C语言中将整数赋值给指针,可以编译通过,但是会发出警告。 int * a = 100; //在C++中,则不可以,因为int 和int *是两种类型。 int * a = (int *)100;//也可以通过强制类型转换。但是,这样做十分危险。。
ps,在C/C++中将NULL初始化指针。要养成这样的好习惯。。不然指针未被赋值时,其内部存储的数据是任意的,无法预测的。十分危险。
第八条:string类和C-风格字符串
string类是ISO/ANSI C++ 添加的。使用时要#include。要使用处理C-风格字符串的函数,如strlen,strcmp,要#include 或者#include。。。其余的。。属于OOP和C语言基本功的问题了。。。
另外,C++很早就有istream类,而string类是后期出现的。所以cin>>和cin.getline()都没有考虑针对string类的重载。。所以通过重载>>和getline()为string类和istream类的友元函数实现cin>>str, getline(cin, str)。。不能用cin.getline(string, int)。。
第九条结构体:struct
记住所有C支持的struct的特性,C++都支持。但是C++具有很多独有的特性。而且这种特性是类(class)相似的。
- 在C中,声明结构体变量时struct关键字不能省略。但是在C++中可以。C++这种变化是强调结构声明定义了一种新类型。类比类(class),声明类变量时不必加上class关键字。。
- C和C++都支持同结构类型的结构变量使用 = 赋值。。。成员值会完全相同。。
- 结构体可以声明构造函数,可以声明自己的方法,可以重载操作符,可以有public和private等权限。。稍后总结。。
逻辑操作符的其它表示方法
C++为逻辑操作符提供标识符表示方法:and,or,not。这些都是C++的保留字,可以直接使用。但是它们在C中不是保留字。只有在程序中#include才能使用它们。
操作符 | 替换代表 |
---|---|
&& | and |
|| | or |
! | not |