- 浏览: 84778 次
- 性别:
- 来自: 东莞
-
文章分类
最新评论
-
0769:
呵呵,你是你们厉害而已....像我不厉害的....当然觉得它变 ...
变态级JAVA程序员面试32问(附答案) -
tmhbc:
这很正常呀。基础而且实际。
变态级JAVA程序员面试32问(附答案) -
lordhong:
这些是基本常识... 哪里变态来着? 去面试都是这些题目.. ...
变态级JAVA程序员面试32问(附答案) -
cocal:
Visual Basic 这辆车, 开着你.
好像前面说那 ...
假如编程语言是私家车 -
shuaiwawa:
Visual Basic 这辆车, 开着你.
假如编程语言是私家车
还记得当年学数学、英语都有个窍门,那就是搞个错题集。经常复习一下这个错题集,就可以避免下次犯同样的错误。而几乎所有的程序员都是从犯错误开始的,我们也很有必要总结一下编程新手的常见错误,本文的目的在于此。文中所列出的都是笔者在项目开发中接触到的新手真实的言谈,笔者学学文革腔调,姑且称之为“错误语录”。
2.语录
<iframe border="0" marginwidth="0" marginheight="0" src="http://219.239.88.50:80/adsunion/get/;pl=pl-20-pip-software;tp=if;sk=0;ck=0;/?" frameborder="0" noresize="noresize" width="1" scrolling="no" height="1"></iframe> (1)“我的程序都是对的,可结果不对”
想想你的周围,是不是也有人说这样的话?如果你也曾经说过,那就此打住,不要再说这句话,因为这句话只会显示说话者的无知。既然程序都是对的,那为什么结果不对?
(2)“程序=算法+数据结构”
如果刚刚学完C语言,我们说这样的话,完全可以理解,而且可以说是正确的。但是如果你是一位即将从事C/C++编程的程序员,那么很遗憾,这个说法只能判错,殊不知,世界上还有另一种说法:
程序 = 对象 + 消息
“程序=算法+数据结构”只对面向过程的语言(C)成立,而对面向对象的语言(C++),则只能表述为“程序=对象+消息”。传统的过程式编程语言以过程为中心以算法为驱动,面向对象的编程语言则以对象为中心以消息为驱动。这里的消息是广义的,对象A调用了对象B的成员函数,可看作对象A给B发消息。
(3)“程序编出来,运行正确就行了”
运行正确的程序并不一定是好程序,程序员时刻要牢记的一条就是自己写的程序不仅是给自己看的,要让别人也能轻易地看懂。很遗憾,许多的编程新手不能清晰地驾驭软件的结构,对头文件和实现文件的概念含糊不清,写出来的程序可读性很差。
C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:
规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;
规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
规则3 永远不要在.h文件中定义变量;
许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:
/*模块1头文件:module1.h*/ int a = 5; /* 在模块1的.h文件中定义int a */ /*模块1实现文件:module1 .c*/ #include “module1.h” /* 在模块1中包含模块1的.h文件 */ /*模块2实现文件: module2.c*/ #include “module1.h” /* 在模块2中包含模块1的.h文件 */ /*模块2 实现文件:module3 .c*/ #include “module1.h” /* 在模块3中包含模块1的.h文件 */ |
以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这明显不符合编写者的本意。正确的做法是:
/*模块1头文件:module1.h*/ extern int a; /* 在模块1的.h文件中声明int a */ /*模块1实现文件:module1 .c*/ #include “module1.h” /* 在模块1中包含模块1的.h文件 */ int a = 5; /* 在模块1的.c文件中定义int a */ /*模块2 实现文件: module2 .c*/ #include “module1.h” /* 在模块2中包含模块1的.h文件 */ /*模块3 实现文件: module3 .c*/ #include “module1.h” /* 在模块3中包含模块1的.h文件 */ |
这样如果模块1、2、3操作a的话,对应的是同一片内存单元。
规则4 如果要用其它模块定义的变量和函数,直接包含其头文件即可。
许多程序员喜欢这样做,当他们要访问其它模块定义的变量时,他们在本模块文件开头添加这样的语句:
extern int externVar; |
抛弃这种做法吧,只要头文件按规则1完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。
(4)“数组名就是指针”
许多程序员对数组名和指针的区别不甚明了,他们认为数组名就是指针,而实际上数组名和指针有很大区别,在使用时要进行正确区分,其区分规则如下:
规则1 数组名指代一种数据结构,这种数据结构就是数组;
例如:
char str[10]; char *pStr = str; cout << sizeof(str) << endl; cout << sizeof(pStr) << endl; |
输出结果为:
10 4 |
这说明数组名str指代数据结构char[10]。
规则2 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10]; char *pStr = str; str++; //编译出错,提示str不是左值 pStr++; //编译正确 |
规则3 指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址;
规则4 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
例如:
void arrayTest(char str[]) { cout << sizeof(str) << endl; //输出指针长度 str++; //编译正确 } int main(int argc, char* argv[]) { char str1[10] = "I Love U"; arrayTest(str1); return 0; } |
(5)“整形变量为32位”
整形变量是不是32位这个问题不仅与具体的CPU架构有关,而且与编译器有关。在嵌入式系统的编程中,一般整数的位数等于CPU字长,常用的嵌入式CPU芯片的字长为8、16、32,因而整形变量的长度可能是8、16、32。在未来64位平台下,整形变量的长度可达到64位。
长整形变量的长度一般为CPU字长的2倍。
在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为WIN32平台):
typedef struct tagTypeExample { unsigned short x; unsigned int y; }TypeExample; |
他们这样定义:
#define unsigned short UINT16 //16位无符号整数 #define unsigned int UINT32 //32位无符号整数 typedef struct tagTypeExample { UINT16 x; UINT32 y; }TypeExample; |
这样定义的数据结构非常具有通用性,如果上述32平台上的数据发送到16位平台上接收,在16位平台上仅仅需要修改UINT16、UINT32的定义:
#define unsigned int UINT16 //16位无符号整数 #define unsigned long UINT32 //32位无符号整数 |
几乎所有的优秀软件设计文档都是这样定义数据结构的。
(6)“switch和if …else…可随意替换”
switch语句和一堆if…else…的组合虽然功能上完全一样,但是给读者的感受完全不一样。if…else…的感觉是进行条件判断,对特例进行特别处理,在逻辑上是“特殊与一般”的关系,而switch给人的感觉是多个条件的关系是并列的,事物之间不存在特殊与一般的关系,完全“对等”。
譬如:
//分别对1-10的数字进行不同的处理,用switch switch(num) { case 1: … case 2: … } //对1-10之间的数字进行特殊处理,用if if(num < 10 && num > 1) { … } else { … } |
许多时候,虽然不同的代码可实现完全相同的功能,但是给读者的感觉是完全不同的。譬如无条件循环:
while(1) { } |
有的程序员这样写:
for(;;) { } |
这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C/C++语言中意味着无条件循环才明白其意。而不懂C/C++语言的读者看到while(1)也可猜到这是一个无条件循环。
(7)“免得麻烦,把类里面的成员函数都搞成public算了”
许多人编C++程序的时候,都碰到这样的情况,先前把某个成员函数定义成类的private/protected函数,后来发现又要从外面调用这个函数,就轻易地将成员函数改为public类型的。甚至许多程序员为了避免访问的麻烦,干脆把自己添加的成员函数和成员变量都定义成public类型。
殊不知,这是一种规划的失败。在类的设计阶段,我们就要很清晰地知道,这个类的成员函数中哪些是这个类的接口,哪些属于这个类内部的成员函数和变量。一般的准则是接口(public成员)应在满足需求的前提下尽可能简单!
所以不要轻易地将private/protected成员改为public成员,真正的工作应该在规划阶段完成。
3.结束语
所有的程序员都要经历一个从糊涂到清晰的过程,文中的错误如果你也犯了,切勿自惭。
更多的错误语录,希望能在后续文章中陆续推出。
发表评论
-
6个变态的C语言Hello World程序
2013-02-19 13:54 780下面的六个程序片段主要完成这些事情: 输出Hel ... -
从C++转到Java需注意的地方
2010-08-31 22:33 8861.Java在虚拟机上运行 Jav ... -
ASP.NET和PHP性能对比
2010-08-31 22:28 947经过一些筛选,只选择一些代表性的看法进行翻译, 对于英文不是太 ... -
classpath的理解
2010-08-23 23:19 927jvm的类加载分三中方式: 系统级别:rt.jar ... -
用JavaScript的事件代理实现互动
2010-01-27 00:53 1160用JavaScript的事件代理实现互动 2009年01月 ... -
[翻译]沙发之争——过程与对象的对话
2008-09-02 00:48 877[翻译]沙发之争——过程与对象的对话译文作者:意识 信息来源: ... -
变态级JAVA程序员面试32问(附答案)
2008-08-08 00:55 1336变态级JAVA程序员面试32问(附答案) ... -
七月开发语言排行榜出炉 PowerShell有望成为年度黑马(图)
2008-07-11 00:17 2880转自:http://java.csdn.net/pag ... -
下一代浏览器脚本语言——C?
2008-07-11 00:08 1034Adobe的Scott Petersen上周在M ... -
一个定时重启关机的小程序
2008-07-02 14:55 1612此小程序只实现了定时重启或关机功能,我代表原作者欢迎大家增强它 ... -
假如编程语言是私家车
2008-05-11 11:52 1880假如编程语言是私家车 (If programming lang ... -
TC2.0下写汇编
2008-01-25 12:22 1768按照TC2.0的帮助系统所 ... -
计算机语言妙语录 软件就像性一样
2007-12-26 16:44 1103计算机语言妙语录 软件就像性一样 来自:译言 应当知道 ... -
写好C程序的10条秘籍
2007-08-08 17:59 1015神乎其技,惟C程序, ... -
Linux 下 C 语言编程
2007-06-29 11:20 1115... -
猴子吃桃问题。
2007-06-28 17:03 2022基于C语言实现, 猴子吃桃问题: 猴子第一天摘下若干个桃,当即 ... -
Windows程序设计
2007-06-28 11:56 1124书不可以尽信!! 尽信书不如无书,书只是人类进步的阶梯!! 进 ... -
C++中的指针(一) 简单指针
2007-06-26 14:07 1043C++中的指针(一) 简单指针 简单总结一下C++ ... -
明晰C++内存分配的五种方法的区别
2007-06-26 14:01 1245明晰C++内存分配的五种方法的区别 ... -
解Joseph(约瑟夫)环问题的牛代码
2007-06-26 13:48 2000解Joseph(约瑟夫)环问题的牛代码 问题描 ...
相关推荐
总之,C++编程新手需要克服这些常见的错误观念,通过学习和实践,逐步提升自己的编程技能。掌握良好的编程习惯,理解面向对象的精髓,注意代码的组织和可读性,正确处理数组与指针,以及重视内存管理和异常处理,将...
C/C++编程新手错误语录 C++书籍小检阅![讨论] 成为编程高手的五个阶段 学习c++的50条忠告(初学者必看) 你应当如何学习C++(以及编程) ....等等.... 这是我二年在网上,收集的一个比较全的经验集合 对认识编程与学习...
这些语录可能涵盖编程风格、错误处理、内存管理、性能优化等多个方面,旨在引导读者形成良好的编程习惯和思维方式。 在文件名"C++1.doc"中,我们可以推测这是一个文档文件,其中详细地阐述了作者的观点和建议。文档...
通过这个示例,我们可以看到现代C++编程风格与传统C编程之间存在着明显的差异。C++提供了更高级别的抽象和更强大的工具,使得编写高效、可维护的代码变得更加容易。同时,Stroustrup指出,尽管C++引入了许多新特性,...
qt 一个基于Qt Creator(qt,C++)实现中国象棋人机对战.
热带雨林自驾游自然奇观探索
冰川湖自驾游冰雪交融景象
C51 单片机数码管使用 Keil项目C语言源码
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
前端分析-2023071100789s12
Laz_制作了一些窗体和对话框样式.7z
1、文件内容:ocaml-docs-4.05.0-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ocaml-docs-4.05.0-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
学习笔记-沁恒第六讲-米醋
工业机器人技术讲解【36页】
内容概要:本文档详细介绍了在 CentOS 7 上利用 Docker 容器化环境来部署和配置 Elasticsearch 数据库的过程。首先概述了 Elasticsearch 的特点及其主要应用场景如全文检索、日志和数据分析等,并强调了其分布式架构带来的高性能与可扩展性。之后针对具体的安装流程进行了讲解,涉及创建所需的工作目录,准备docker-compose.yml文件以及通过docker-compose工具自动化完成镜像下载和服务启动的一系列命令;同时对可能出现的问题提供了应对策略并附带解决了分词功能出现的问题。 适合人群:从事IT运维工作的技术人员或对NoSQL数据库感兴趣的开发者。 使用场景及目标:该教程旨在帮助读者掌握如何在一个Linux系统中使用现代化的应用交付方式搭建企业级搜索引擎解决方案,特别适用于希望深入了解Elastic Stack生态体系的个人研究与团队项目实践中。 阅读建议:建议按照文中给出的具体步骤进行实验验证,尤其是要注意调整相关参数配置适配自身环境。对于初次接触此话题的朋友来说,应该提前熟悉一下Linux操作系统的基础命令行知识和Docker的相关基础知识
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
网络小说的类型创新、情节设计与角色塑造
毕业设计_基于springboot+vue开发的学生考勤管理系统【源码+sql+可运行】【50311】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:班级信息、学生信息、课程信息、考勤记录、假期信息、公告信息 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。