| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1190 人关注过本帖
标题:[转载]c/c++ 常见误区(很好的文章).
只看楼主 加入收藏
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
 问题点数:0 回复次数:10 
[转载]c/c++ 常见误区(很好的文章).

1. C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁比谁先进的说法,更重要的一点是C和C++各自的标准委员会是独立的,最新的C++标准是C++98,最新的C标准是C99。因此也没有先学C再说C++的说法,也不再(注意这个"不再")有C++语法是C语法的超集的说法。

2. C++/CLI 和 C# 是微软的,它们与C和C++没有任何关系,虽然部分语法相似。但哪两种语言不相似呢?都是abc这26个字母。

3. 不要使用TC/TC++/BC/CB等古老的编译器来学习C/C++,因为它们太古老了,不支持新的C/C++标准。不要使用CBX/VC++6.0/VC2005等对C/C++标准支持不好的编译器,虽然这些编译器适合工作,但不适合学习,因为它们中的语法陷阱很多。记住唯一适合学习的编译器是gcc/mingw。[antigloss注:Dev-C++ 使用的编译器就是gcc & g++]

4. 不要用""代替<>来包含系统头文件,虽然有些编译器允许你这样做,但它不符合C/C++标准。
错误的示例:#include "stdio.h",#include "iostream"。[antigloss注:<> 用于包含标准头文件和系统头文件,"" 用于包含自定义头文件。标准似乎没有明确规定不准用 "" 包含标准头文件和系统头文件。使用 "" 包含标准头文件或者系统头文件只能说是一种不良风格。]

5. 不要将main函数的返回类型定义为void,虽然有些编译器允许你这样做,但它不符合C/C++标准。不要将函数的int返回类型省略不写,在C++中要求编译器至少给一个警告。错误的示例:void main() {},main() {} [antigloss注:C99和C++98都要求编译器对省略int至少发出一个警告]

6. 不要把VC++中的 #include "stdafx.h" 贴出来,它是预编译头文件。如同上菜时不要把厨师也放到托盘中。

7. [C++]不要#include <iostream.h>,不要#include <string.h>,因为它们已经被C++标准明确的废弃了,请改为 #include <iostream> 和 #include <cstring>。规则就是:
a. 如果这个头文件是旧C++特有的,那么去掉.h后缀,并放入std名字空间,
比如 iostream.h 变为 iostream。
b. 如果这个头文件是C也有的,那么去掉.h后缀,增加一个c前缀,比如 string.h
变为 cstring;stdio.h 变为 cstdio, 等等。
BTW:不要把string、cstring、string.h三个头文件搞混淆
BTW:windows.h不是C/C++的标准文件,因此它的命名C/C++不管。

8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p = "XXX",编译器之所以让前者通过编译是为了兼容以前的大量的旧代码。
BTW:const TYPE* p 和 TYPE const* p 是一样的,风格不同而已。
BTW:C语言中也有const关键字。

9. 不要在同一条语句中包含一个变量的多个++/--,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个人行为。

10. C/C++ 是平台无关性语言,因此系统相关的 process/GUI 等不在标准 C/C++ 库中。比如 graphics.h 和 windows.h 等是由某个编译器提供的,而不是由C/C++ 提供的。

11. C/C++只是语言,而且是平台无关性语言。论坛上有部分人甚至认为C就是dos,C++就是windows,那么请问linux是什么?

12.[C++]面向对象曾经是设计C with class(C++的前身)的主要目的,但C++不是,C++是一个多典范语言。主要支持过程调用、基于对象、面向对象、泛式编程这四种编程典范。当然还支持functional, generative,metaprogramming等典范。

13. 语法学家不是文学家,所以当你学会了一门计算机语言时,你还需要学习数据机构和算法,还需要掌握工具和平台API的用法。

14. C/C++ 是通用语言,因此语法很复杂,你应当裁减成适合你自己的语法集合,比如裁减成 better C 和 ADT。

15. C/C++是通用语言,因此只含通用的库,你应该丰富自己需要的库,比如汽车工业协会有自己的C/C++函数/类/模板库。

搜索更多相关主题的帖子: 误区 微软 语法 语言 
2007-04-21 17:26
yushui
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:1355
专家分:22
注 册:2006-7-19
收藏
得分:0 
顶了 呵呵 有好多自己都没注意

fighting!from now on!
2007-04-21 18:40
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 

4. 不要用""代替<>来包含系统头文件,虽然有些编译器允许你这样做,但它不符合C/C++标准。
错误的示例:#include "stdio.h",#include "iostream"。[antigloss注:<> 用于包含标准头文件和系统头文件,"" 用于包含自定义头文件。标准似乎没有明确规定不准用 "" 包含标准头文件和系统头文件。使用 "" 包含标准头文件或者系统头文件只能说是一种不良风格。]
""的意思是让编译器从标准库路径开始搜索
<>的意思是让编译器从用户的工作路径开始搜索

8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p = "XXX",编译器之所以让前者通过编译是为了兼容以前的大量的旧代码。
BTW:const TYPE* p 和 TYPE const* p 是一样的,风格不同而已。
BTW:C语言中也有const关键字。

虽然const char* p = "XXX"也能指向char类型的对象,也就是说他揉和了char*类型的指针的作用
但是揉和并不是融和,
不仅降低了程序的可读性
而且如果要改变p所指的对象的值。那么只能直接改变它所指的对象,而不能用*p = ...;

另外
const TYPE* p 和 TYPE* const p 不是一样的.
(const TYPE* p 和 TYPE const* p 确实是一样的,风格不同而已)
TYPE* const p是声明一个固定的指针,也就是说指针本身是固定指向某一个TYPE类型的对象
const TYPE* p是声明一个指向固定对象的指针,也就是说指针本身的值可以变,但是他指向的是个TYPE类型的const对象
另外,
typedef TYPE* ptype;
const ptype cp;
他等价于
string *const cp;
不应该把typedef当做是文本扩展,声明const ptype时,const修饰符是ptype的类型,
也就是说,声明语句把cp定义为指向TYPE对象的const指针

[此贴子已经被作者于2007-4-21 20:26:19编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-04-21 19:35
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
9. 不要在同一条语句中包含一个变量的多个++/--,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个人行为。
如果它们在某些类型中使用时的返回值与内置类型不一样,那并不是所谓的编译器的个人行为,
很可能是那些类型自己的重载 前/后置自增/减操作符 有意无意地与内置类型不一样。
至于某些语句的求值顺序这个应该是有规定的吧!

[此贴子已经被作者于2007-4-21 22:09:48编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-04-21 19:42
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 

7. [C++]不要#include <iostream.h>,不要#include <string.h>,因为它们已经被C++标准明确的废弃了,请改为 #include <iostream> 和 #include <cstring>。规则就是:
a. 如果这个头文件是旧C++特有的,那么去掉.h后缀,并放入std名字空间,
比如 iostream.h 变为 iostream。
b. 如果这个头文件是C也有的,那么去掉.h后缀,增加一个c前缀,比如 string.h
变为 cstring;stdio.h 变为 cstdio, 等等。
BTW:不要把string、cstring、string.h三个头文件搞混淆
BTW:windows.h不是C/C++的标准文件,因此它的命名C/C++不管。
string是专为string这个类型的头文件,他里面的东西基本上是string类的成员函数、变量
而C中的string中的函数是为字符数组提供的一些算法,如strcpy将一个char*类型的const或非const对象
复制到另一个char*类型的对象。

至于是用cstring还是用string应该取决于用途
而是用string.h还是用cstring取决于怎么声明名字空间或是是否声明名字空间,还是多看看书吧

从理论上来讲,C中的头文件要在C++中用,应该去掉.h在前面加上c

并非楼主所说的废弃.


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-04-21 19:58
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

斑竹,你错了哦!!!

TYPE const* p是声明一个固定的指针,也就是说指针本身是固定指向某一个TYPE类型的对象
const TYPE* p是声明一个指向固定对象的指针,也就是说指针本身的值可以变,但是他指向的是个TYPE类型的const对象

他们都好似声明一个指针p指向固定对象。

而声明一个固定指针是:TYPE* const p;


hehe^^

还有,这只是转载的,不是权威,他的很多观点我认为是很好的呀!


Fight  to win  or  die...
2007-04-21 20:00
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
5. 不要将main函数的返回类型定义为void,虽然有些编译器允许你这样做,但它不符合C/C++标准。不要将函数的int返回类型省略不写,在C++中要求编译器至少给一个警告。
C++之父Bjarne Stroustrup在他的主页上明确写着
The definition void main(){/*...*/}is not and never has been C++,nor has it even been C.

为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-04-21 20:01
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
以下是引用aipb2007在2007-4-21 20:00:08的发言:

斑竹,你错了哦!!!

TYPE const* p是声明一个固定的指针,也就是说指针本身是固定指向某一个TYPE类型的对象
const TYPE* p是声明一个指向固定对象的指针,也就是说指针本身的值可以变,但是他指向的是个TYPE类型的const对象

他们都好似声明一个指针p指向固定对象。

而声明一个固定指针是:TYPE* const p;

呵呵,,不好意思,,写错了,,改过来了,,


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-04-21 20:05
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

总结的不错哦 灵活掌握吧

推荐看看 <<C++:the complete reference>>这本书, 对C过渡到C++ 以及标准后编程规范的说明蛮不错的


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-21 20:15
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

确实满不错的,还是得尽量按标准的C++.


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-04-21 22:10
快速回复:[转载]c/c++ 常见误区(很好的文章).
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023024 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved