学了C++,遗忘了C
来源:互联网 发布:会计使用的软件 编辑:程序博客网 时间:2024/04/29 13:53
很多C++程序员,应该说是绝大多数,都学过C语言。也都知道,C++是完全兼容C的。在C++和C都作为面向过程开发语言时,这个“兼容”是有两层含义的:
第一,C中的代码复制到cpp文件里,理论上应当可以通过(实际上这一点不能完全做到)。
第二,C++代码,代码在C文件里是不一定允许编译的。
第二点是会慢慢被C++程序员所遗忘的,至少我是应当感到惭愧的其中之一。
下面一一列举一些,面向过程中易忽略的点(待续):
1、 C语言中不存在“引用”
请不要讲C++中引用的概念,想当然的带到C中,在C语言里没有引用这一说。符号“&”,作为操作符可以用它进行取地址操作,作为运算符它是位与运算符。
intf(int ¶)
{
returnpara;
}
以上这个函数声明在C中是绝对不合法的,要达到直接操作实参的效果,只能通过指针型参数来实现。实际上,C++中引用的出现完全是为了代码的直观已读,没有增加什么新的特性,因为凡是用引用的能实现的功能我们用指针都可以的。
2、 强制类型转换操作符“()”
#include<stdio.h>
intmain()
{
inta=1;
printf("%c/n",char(a));
return 0;
}
在C中,以上这段代码是编译不通过的,C++程序员找这个错误是有点难的,大家可以想一想错在哪儿了,呵呵。
3、 C语言中没有函数模板,这个错在误编译时,会集中地暴露在class和typename这两个关键字上。
4、 C++中声明函数形参默认值的方式不能带到C中来
其实,早在C语言中,函数已经具有了多态特性,我们最常用的一个例子就是printf()函数。它的参数列表是可变的,但是这不是用简单的形参默认值实现的,它有专门的稍微复杂的方法实现。
5、 C语言中的前置自增和前置自减运算符不可做左值(栽过跟头)
inta=0;
++a=2;
这两行代码在cpp文件中编译时,是合法的,得到结果a=2。但是在C文件中会产生一个编译时错误,原因就在于C中的前置自增的结果不是左值的。
6、 全局变量的初始化问题
在C中全局变量的声明时初始化等号右边只能常量表达式,即不含有函数的表达式。但是,在C++中这是可以的,而且可以正确编译和运行。
#include<stdio.h>
intf(inta)
{
returna;
}
intpara=f(2);
intmain()
{
printf("%d/n",para);
return 0;
}
这段代码在cpp文件中是可以运行的,但是在C文件中将产生编译时错误:初始值设定不是常量。
7、 局部变量的声明位置问题
( 这个错误太要命!!!)
C语言中函数中局部变量的声明,必须在整个函数块域的前面完成。但是,在C++中我们可以随用随声明。
voidf()
{
inta=0;
printf("");
intb=1;
}
这个函数在C文件中,编译时会产生一个错误:缺少;在类型前面。
8、 C语言中没有bool类型
在C中几乎所有表达式都可以作为判断语句的条件,如果一定要设置开关变量的时候,基本上使用int类型代替bool。
9、 C语言中没有内联函数(无inline关键字)
要实现函数内敛的效果,C中一律通过宏实现,一般为带参数的宏。
10、 C语言中的函数,后面不能加const关键字
这不是危言耸听,这么用的真有其人,例子一个
11、 C语言不对函数指针的参数列表进行编译时类型检查
下面的代码在C中是连警告都没有的,在C++中报错2个。
int func(char *a, int b){ return b;}typedef int (*T_Function)();int main(){ T_Function f = func; f("", 100); return 0;}
- 学了C++,遗忘了C
- 开始学C了
- 我开始了学C#!
- 学C了,应该认真
- 开始想学C了
- 学了c之后,该学什么
- 要开始学c语言了
- 学C语言的,有福了,
- 开始重新来学C语言了
- 学了好些年C和C++了
- c语言 指针(遗忘太久,用到时候都忘记了,复习复习)--恶补之一
- 又转回学C了,重温C算法
- 学了C/C++,我能做什么?
- 遗忘了的昨天
- 开始学C++了,有些迷茫
- 从头再学C语言:终于开始动动脑子了。
- 学了一年多的C++,接着应该如何继续?
- 学C/C++的同学们,有福了!
- ffmpeg常用参数一览表
- Response.ContentType 类型详解
- 多线程程序的分析浅见(c++)
- XT800内置软件的更换和删除
- Some ideas to embedding lua into C/C++
- 学了C++,遗忘了C
- 关于j2ee中获取路径的问题!!
- 在RAM中调试NativeSample
- DELPHI 获取版本号、格式化版本信息、比较版本号等相关操作
- 《SOA思想、技术与系统集成应用详解》读书笔记一
- java字符编码原理解析
- c# 制作进度条
- 老板最看重员工的15种品质
- windows2008R2 访问其他机器 用户名一直有本机名