第一篇:C语言C++程序员编程必备
Java,NET,PHP,Ruby,Perl 和 Python 等,但今天我们要讨论的是两个最古老和流行的语言的C和C++。它们都有其特殊的地方,更有效的功能和支持的工具,这两种语言仍然很活跃。
今天我们整理了一些令人印象深刻的IDE(集成开发环境)和编译器推荐给 C 和 C++ 程序员。集成开发环境,主要用于提供软件应用的各种组件而开发的,其中最流行的功能是它们都有吸引力的用户界面。1)Best IDE for C/C++ – kDevelop KDevelop 是基于 KDevPlatform 的可使用开源插件扩展的 IDE。KDevPlatform 是一种可以用来作为 IDE 的基础库的开源集。
2)Best IDE for C/C++-Anjuta Anjuta Devstudio 具有先进的编程工具,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI设计器,分析器和许多工具,另一个伟大的开发工作室。此工具提供的 C/C++ 程序员有很大强大的用户界面开发接口。
3)Best IDE for C/C++Eclipse CDT Eclipse CD 是最强大和最流行的IDE之一,提供了更高效的功能,如:项目的创建和管理,构建支持不同的工具链,标准make编译,源代码导航,各种来源的知识工具,代码编辑器,语法高亮,折叠和超链接导航,源代码重构和代码生成,可视化调试工具,包括内存,寄存器等等。
7)Best IDE for C/C++ – Compilr Compilr 是在线集成开发工具,让您与令人印象深刻的功能和简单的用户界面编写代码。该工具支持的编程语言中广泛的C,C + + JAVA,HTML等等。
8)Best IDE for C/C++Netbeans C++ Netbeans 的工具包括许多适合 C 和 C++ 项目类型模板,可以 使用动态库和静态创建 C/C++ 应用程序库。它拥有迷人的功能:代码协助,编译器配置,单元测试,源检查,远程开发和文件导航等等。
10)Best IDE/Compiler for C/C++Ultimate++ Ultimate++是对于 C++ 程序员来说是很好框架。这个 IDE 引入了模块化概念,可以结合 GCC,MinGW 和 Visual C++。
12)Best Compiler for C/C++-Digital Mars DigitalMars 是一款高性能的 C/C++ 编译器。包括的功能,如速度最快的编译/链接时,强
HTML文档,反汇编,图书管理员,资源编译器,make等,命令行和GUI版本,教程,代码示例,在线更新,标准模板库等等。
13)Best IDE for C-C-Free
14)Best Compiler for C/C++ – MinGW MinGW 编译器提供访问微软的C运行库和一些特定语言运行库的功能。
15)Best Compiler for C – Tiny C Compiler iny C Compiler 是最好的编译器之一,让开发人员可以在任何地方编译代码,可以使用任何 C 动态库,编译并直接执行C++源程序,也包含完整的 C 预处理器和 GNU 汇编器。
@扣丁学堂 智悦分享
第二篇:C++编程心得
紧张忙碌的一周过去了,在这个星期里我们小组胜利地将我们选定的课题研究出来,我为我的小组骄傲,也为自己骄傲。
我们的题目是银行定期存款管理系统,在编程过程中,我预订的任务是学习并掌握MFC,并将其运用到我们的程序中。学习MFC的过程是我认为非常痛苦的事,因为完全都是自学,并且因为图书馆中的相关书籍全部被借阅出去,所以没有太多的自学资料,因此虽然费了很大的精力,但仍是无果。经过了很多的小组讨论和自己的心理斗争后最终决定放弃MFC而将自己能力以内的程序尽可能地优化,就这样,我开始在半路阶段加入了程序优化的工作,一遍遍的调试程序,遇到某个攻坚问题,几个人一起在网上查询,一起想解决的办法,就这样,我们团结地将我们现在认为将近完美的程序呈现给老师和同学。
一开始学习MFC时,我总是不能很好的转换思维,不能将自己以前的编程思想和以前的一些不良编程习惯甩掉,因此很多的程序都联系不起来,反而是自己学会了好多的零碎的片面却无法将程序大楼竖起来。在困惑很久后,我选择了询问老师,老师耐心地将MFC的思维方式讲给了我听,这让我受益匪浅,虽然我最后没能将MFC成功的做出来,但我认为我从MFC中才直接地感受到了C++中面向对象编程的封装性。以前用C++编程时总是将类中的变量随便规定属性,甚至在编程的过程中突然需要加一个变量,为了省事直接将其放于public中,在学习了解MFC后,深刻地感受到自己以前的编程习惯是多么的不科学,而那些习惯又是多么的重要。
我们这一次是以团队的形式来做这个项目,并且作为这个小组的组长,我感觉自己的压力很大,因为团队合作不仅讲求整体的团结而且为了团队工作的高效又要有明确的分工。在我们的小组工作中每个人都一刻不放松自己手里的工作,而一些时候我们又配合地很密切,尤其是当我们遇到程序的瓶颈时,我们都是在宿舍里你一句我一句地出谋划策,在遇到一个提取时间的程序时,大家纷纷查询各种辅导书,上网查各种资料,在遇到定期存款支取问题时甚至打电话给家长,寻求“场外支持”,种种的配合都给我们这个部门协调的运作提供了动力。我感谢我的团队,他们让我有一种很舒服的做事情的感觉。
最终决定放弃MFC,我承认自己有一种如释重负的感觉,但是也有一丝惭愧,无论老师要求与否,既然自己决定了就应该走下去,但是我最后退却了,感觉很遗憾也很羞愧,因为我认为对自己降低要求就是放纵自己堕落。
短学期实习,我着实收获了很多,不仅仅是知识上,而且是思考事情方法,我感激这次的实习,也感谢给予我们很多帮助的老师,更感谢我团结的团队。
第三篇:C++编程思想读后感
Unit One对象的演化
oop技术能够很容易地将大量问题归纳为一个简单的解,这一发现产生了大量的oop语言,其中最著名的是Smalltalk—C++之前最成功的oop语言。
继承表示了基本类型和派生类型之间的相似性,程序员创建一个基本类型以描述系统中一些对象的思想核心。由这个基本类型派生出其他类型,表达了认识该核心的不同途径。
早捆绑意味着编译器对特定的函数名产生调用,而连接器确定调用执行代码的绝对地址。对于。Oop采用动态绑定。当给对象发送消息时,在程序运行之前不去确定被调用的代码。编译器保证这个被调用的函数存在,并完成参数和返回值的类型检查,但是它不知道将执行的准确代码。为了实现晚捆绑,编译器在真正调用的地方插入一段特殊的二进制代码。通过使用存放在对象自身中的信息,这段代码在运行时计算被调用函数的地址。这样,每个对象就能根据一个指针的内容有不同的行为。当一个对象接收到消息时,它根据这个消息判断应当做什么。
程序员可以用关键字v i r t u a l表明他希望某个函数有晚捆绑的灵活性,而并不需要懂得v i r t u a l的使用机制。没有它,就不能用C + +做面向对象的程序设计。Vi r t u a l函数(虚函数)表示允许在相同家族中的类有不同的行为。这些不同是引起多态行为的原因。
用C 语言编写的过程程序就是一些数据定义和函数调用。要理解这种程序的含义,程序员必须掌握函数调用和函数实现的本身。这就是过程程序需要中间表示的原因。中间表示容易引起混淆,因为中间表示的表述是原始的,更偏向于计算机,而不偏向于所解决的问题。
通常,面向对象程序需要较少的代码,因为问题中的许多部分都可以用已存在的库代码。
C+ +成功的原因是经济上的:转变到O O P需要代价,而转变到C + +所花的代价较小。尽可能地为程序员提供最大便利。
为C + +堵塞了C语言中的一些漏洞,并提供更好的类型检查和编译时的分析。程序员必须先说明函数,使编译器能检查它们的使用情况。预处理器虚拟删除值替换和宏,这就减少了查找疵点的困难。C + +有一个性能,称为r e f e r e n c e s(引用),它允许对函数参数和返回值的地址进行更方便的处理。函数重载改进了对名字的处理,使程序员能对不同的函数使用相同的名字。另外,名字空间也加强了名字的控制。许多性能使C的更安全。面向对象的C + +程序的速度与用C写的程序速度相差在± 1 0 %之内,而且常常更接近。用O O P方法设计的程序可能比C的对应版本更有效。
c+ +的主要目标是让程序员能更容易地使用库,这是通过将库转换为新数据类型(类)来完成的。引入一个库,就是向该语言增加一个新类型。编译器负责这个库如何使用,保证适当的初始化和清除,保证函数被正确地调用。
• 模板的源代码重用
一些重要的类型要求修改源代码以便有效地重用。模板可以自动完成对代码的修改,因而是重用库代码特别有用的工具。用模板设计的类型很容易与其他类型一起工作。因为模板对程序员隐藏了这类代码重用的复杂性,所以特别好用。
C + +的异常处理(见第1 7章的内容)保证能检查到错误并进行处理。
C语言同样有这样的限制,例如当程序超过50 000行时,名字冲突就开始成为问题。简言之,程序员用光了函
数和变量名。设计C + +的目的是为了辅助大程序设计,也就是说,去掉小程序和大程序之间复杂性的分界。
程序设计有两个原则:
1)内部原则体现在程序自身的结构中,机灵而有见解的程序员可以通过程序设计语言的表达方式了解这种内部原则。
2)外部原则体现在程序的源信息中,一般被描述为“设计文档”(不要与产品文档混淆)。
过程语言:为科学工作者使用的F O RT R A N(F O R m u l a-T R A N s l a t i o n)和为商业者使用的C O B O L
(COmmon Business-Oriented Language)。纯计算机科学中很成功的语言是L i s p(L i s t-P r o c e s s i n g),而面向数学的语言应当是A P L(A Programming L a n g u a g e)。
1.3.4 对象设计的五个阶段
1)对象发现这个阶段出现在程序的最初分析期间。可以通过寻找外部因素与界线、系统中的元素副本和最小概念单元而发现对象。如果已经有了一组类库,某些对象是很明显的。类之间的共同性(暗示了基类和继承类),可以立刻出现或在设计过程的后期出现。
2)对象装配我们在建立对象时会发现需要一些新成员,这些新成员在对象发现时期未出现过。对象的这种内部需要可能要用新类去支持它。
3)系统构造对对象的更多要求可能出现在以后阶段。随着不断的学习,我们会改进我们的对象。与系统中其它对象通讯和互相连接的需要,可能改变已有的类或要求新类。
4)系统扩充当我们向系统增添新的性能时,可能发现我们先前的设计不容易支持系统扩充。这时,我们可以重新构造部分系统,并很可能要增加新类。
5)对象重用这是对类的真正的重点测试。如果某些人试图在全新的情况下重用它,他们会发现一些缺点。当我们修改一个类以适应更新的程序时,类的一般原则将变得更清楚,直到我们有了一个真正可重用的对象。
对象开发原则
1)让特殊问题生成一个类,然后在解其他问题时让这个类生长和成熟。
2)记住,发现所需要的类,是设计系统的主要内容。如果已经有了那些类,这个项目就不困难了。
3)不要强迫自己在一开始就知道每一件事情,应当不断地学习。
4)开始编程,让一部分能够运行,这样就可以证明或反驳已生成的设计。不要害怕过程语言风格的细面条式的代码—类分割可以控制它们。坏的类不会破坏好的类。
5)尽量保持简单。具有明显用途的不太清楚的对象比很复杂的接口好。我们总能够从小的和简单的类开始,当我们对它有了较好地理解时再扩展这个类接口,但不可能简化已存在的类接口。
第2章数据抽象
库,简单地说就是一些人已经写的代码,按某种方式包装在一起。通常,最小的包是带有扩展名如L I B的文件和向编译器声明库中有什么的一个或多个头文件。连接器知道如何在L I B文件中搜索和提取相应的已编译的代码。但是,这只是提供库的一种方法。在跨越多种体系结构的平台上,例如U N I X,通常,提供库的最明智的方法是用源代码,这样在新的目标机上它能被重新编译。而在微软Wi n d o w s上,动态连接库是最明智的方法,这使得我们能够利用新发布的D D L经常修改我们的程序,我们的库函数销售商可能已经将新D D L发送给我们了。
2.1 声明与定义
“声明”向计算机介绍名字,它说,“这个名字是什么意思”。而“定义”为这个名字分配存储空间。无论涉及到变量时还是函数时含义都一样。无论在哪种情况下,编译器都在“定义”处分配存储空间。对于变量,编译器确定这个变量占多少存储单元,并在内存中产生存放它们的空间。对于函数,编译器产生代码,并为之分配存储空间。函数的存储空间中有一个由使用不带参数表或带地址操作符的函数名产生的指针。定义也可以是声明。如果该编译器还没有看到过名字A,程序员定义int A,则编译器马上为这个名字分配存储地址。声明常常使用于e x t e r n关键字。如果我们只是声明变量而不是定义它,则要求使用e x t e r n。对于函数声明,e x t e r n是可选的,不带函数体的函数名连同参数表或返回值,自动地作为一个声明。
C+ +要求必须写出函数原型(的全部信息),因为它增加了一个重要的安全层。
第四篇:C++编程知识总结
1.数组
1.1数组定义时的注意点
1在C++中不提供可变化大小的数组,○即数组定义中的常量表达式不能包含变量。(来源:C++书6.1.1)
int n;cin>>n;float t[n];上例在定义数组t时,变量n没有确定的值,即在程序执行之前,无法知道数组t的元素个数,所以这种声明不被允许。但是可以用new动态分配,如: int n;cin>>n;float *t;t=new float[n];
2在定义数组时,可以不直接指定数组的大小,由C++编译器根据初值表中元素的个数来自○动确定数组元素的个数。例如: int z[]={0,1,2,3,4,5,6,7,8} 3C++语言规定只能对数组中的元素进行赋值或引用,不能把整个数组作为一个整体进行赋○值或引用。(2.3是一个实例)(来源:C++书4同类型的数组之间不能相互赋值 ○如int a[5],b[5];a=b;//错误
strcpy(b,a);//正确
6.1.1)
1.2数组和指针的关系(来源:C++书8.2节8.2.1)
char s[5];在C++中说明了一个数组后,数组名可以作为一个指针来使用,因此s可作为一个指针使用(但它不同于指针,不能赋值运算、算术运算等)。
2.字符数组
2.1输入字符数据 char c;cin>>c;// cin不能将输入的空格赋给字符型变量。
cin.get();//可获得键盘上输入的每一个字符,包括空格和回车键。
2.2字符数组的输入/输出(来源:C++书6.2.4)2.2.1逐个字符输入 char c[10];for(int i=0;i<10;i++)cin>>c[i];2.2.2字符串输入 方法1 char c[10];cin>>c;//即在输入输出时只给数组名
此法在输入字符串时,遇到空格和回车就认为一个字符结束。方法2 cin.getline(字符数组名,允许输入的最大字符个数)此法可把输入的一行作为一个字符串送到字符数组中。
2.3字符数组和字符指针的初始化 2.3.1字符数组初始化 char tx[5]=“";2.3.2字符指针初始化 char *ptx=new char[5];ptx[0]=' ';2.4字符串赋值
方法1 char tx[4]=”abcd“;方法2 char tx[4];//tx=”abcd“;//错误,tx是数组名,不分配内存空间,不可以进行赋值操作;但是数组名可当指针使用(C++书8.2.1)。strcpy(tx,”abcd“);以上两种方法是数组
方法3是指向数组的指针方法 方法3 char *tx;tx=new char[4];tx=”abcd“ 方法4 char *tx=”abcde“;//这相当于根据数组元素的个数,确定数组的大小。tx指针指向这个数组。
//下面实例告诉我们,不仅字符数组与字符指针有区别,用new给定内存空间大小的字符指针与没给定内存空间大小的字符指针也是有区别的 voidmain(){
/*char s[6]=”“;
strcpy(s,”abcd“);cout<
/*char *s=new char[5];strcpy(s,”abcd“);
} cout<
char *s=”“;//分配了内存空间,但不知道大小 strcpy(s,”abcd“);//错误,使用时要注意!!cout<
3.指针
3.1指针可执行的运算
指针可以进行赋值运算、算术运算、关系运算。
1可以将与指针变量同类型的任一变量的地址赋给指针○2在C++中,可以(1)赋值运算:○
3同类型的指针变量之间可以将0赋给任一指针变量,其含义是初始化指针变量,使其为空○相互赋值,不同类型的经强制转换后也可以,通常也没意义。(2)算术运算:指针变量执行“++”或“——”,其含义是使指针变量指向下一个或上一个元素
3.2指针和数组(同1.2)3.3指向数组的指针变量
char(*p)[10];(*p)指明p是一个指针变量,再与[10]结合,表示该指针变量所指向的数据是一个一维数组,该数组由10个元素组成。3.4指针数组
由若干个同类型的指针所组成的数组称为指针数组,数组的每个元素都是一个指针变量。定义指针数组的格式:如char *p[10];由于“[]”的优先级比“*”高,p[10]构成一个数组,再与“*”结合,指明是一个指针数组。3.5指向指针的指针变量 char **pp;3.6 new运算符
注意点:
用new运算符分配的内存空间的指针值必须保存起来,以便于delete运算符归还已动态分配的内存,否则会出现不可预测的错误。3.6.1指向数组的指针 char* m_p1;m_p1=new char[10];//指针m_p1指向含有10个元素的数组空间。for(i=0;i<10;i++)m_p2[i]表示这10个数组元素。
voidmain(){ char *p1;//char b;p1=newchar[5];
//p1=”abcde“;//直接给p1赋字符串,下面for循环中是给每个元素赋值。for(inti=0;i<5;i++){ //b='c';
} p1[i]='a';//p1[i]是数组元素,不是指针
cout<
3.6.2指向指针的指针变量 char**m_p2;//指向指针的指针
m_p2=new char*[10];//指针m_p2指向含有10个元素的指针数组。for(i=0;i<10;i++)m_p2[i]表示这10个指针。
void main(){ char *p1;char **pp;p1=new char[5];pp=new char*[5];for(int i=0;i<5;i++){
p1[i]='a';=&p1[i];//pp[i]是指针
cout<
cout<
3.7 delete运算符
delete释放的不是指针本身,而是指针所指的对象。
4.容器类std::string #include
int main(int argc, char * argv[]){
std::string str=”abc“;
std::string::iterator cit=str.begin();
for(;cit!=NULL;++cit)//NULL比较,我估计肯定不对,虽然你说是可以通过编译
{
std::cout<<*cit< } return 0;} 4.容器类Vector 4.1迭代器和指针的区别 有时需要使用指向vector的一个指针,我们可以这样来做。 vector 表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组。 如果你在一个不好的环境中,他们会告诉你说可以用v.begin()代替&v[0],因为(这些讨厌的家伙将会告诉你)begin返回指向vector内部的迭代器,而对于vector,其迭代器实际上是指针。那经常是正确的,但正如条款50所说,并不总是如此,你不该依赖于此。 begin的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。如果你基于某些原因决定键入v.begin(),就应该键入&*v.begin(),因为这将会产生和&v[0]相同的指针。 这表明迭代器的内容*v.begin()才是vector中第一个元素。 4.2 容器vector的函数clear() 清空vector里所有的元素。因此,如AMProcessList析构函数里一个个删除vector中所有的元素是多此一举。 5.关键字operator 它是说明符,用于重载运算符。 6.函数可以将一个处理的结果值通过函数的Return语句返回,也可以通过参数将处理的多个结果带给调用者。 C++语言在处理函数调用时,参数是自右向左依次入栈的 7.类的前置声明 8.Const char* Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * constcp;(* 读成 pointer to)cp is a const pointer to char--->cp是一个指向字符char的固定指针 const char * ptr;ptr is a pointer to const char;--->ptr是一个指向固定字符char的指针 char const * p;--->无此形式 也就是说,cp和ptr都是指针,cp的值是不可改变的cp指向的内容是可变的;而ptr的值是可以改变的,ptr指向的内容是不可变的 9.String转化为Constchar*,Const char*转化为char* 1.在string里面string.c_str()函数把string转换为了const char*.○代码如下: stringa=”abcd“;const char*p=a.c_str();2const_cast 10.初始化 char *p;char *s=”“;char *t=NULL;p没分配内存,s分配了内存,t为空,11.变量的初始化 1指针需要初始化; ○2基本数据类型声明的变量需要初始化;如double m_dvalue;m_dvalue=0; ○3类声明的对象不需要初始化。○ 12.派生类中的一般成员函数和虚函数 classA { public: voidsolid(){cout<<”基类实函数“<<'n';} virtualvoidvir(){cout<<”基类虚函数“<<'n';} };classAA:publicA { public: voidsolid(){cout<<”派生类实函数“<<'n';} virtualvoidvir(){cout<<”派生类虚函数“<<'n';} }; voidmain(){ A* a=newA;AA* aa=newAA;a=aa; a->vir();//vir()是虚函数。它是运行时的多态性,即在程序运行时,根据具体的执行情况来动态的确定。因此输出”派生类虚函数“,而不是“基类虚函数” a->solid();//solid()是一般成员函数。它是编译时的多态性,即程序编译时就觉得会调用哪个函数。因为a是A类对象的指针,即使派生类AA对象的指针aa赋给a,在编译是已经觉得调用基类A的solid函数,因此输出“基类虚函数”而不是“派生类虚函数” aa->vir();aa->solid(); aa->A::solid();aa->A::vir();} Button newBtn = new Button();newBtn.Location = new System.Drawing.Point(128, 110);newBtn.Name = ”newBtn“;newBtn.Size = new System.Drawing.Size(75, 23);newBtn.Text = ”button2";newBtn.UseVisualStyleBackColor = true;this.Controls.Add(newBtn); ///清除新生成的Btn this.Controls.Remove(newBtn); CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle){ CString m_Caption;m_Caption.LoadString(nID);//取按钮标题 CButton *p_Button = new CButton();ASSERT_VALID(p_Button);p_Button->Create(m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID);//创建按钮 return p_Button;} JAVA、IOS、android、C++、PHP哪个编程语言好 如果你想成为一名前景光明的程序员,则需选择一个适合自己同时热门的编程技术,现在最火的编程技术无非就是java、ios、android、c++和php了,那么,我们该如何选择呢? Java依然是最热的高级编程语言 在高级编程语言中,java无疑是最火爆的,在全世界内应用最为广泛,国内的java热更是有增无减。看看智联和前程无忧等招聘网站上的招聘信息就知道了,java是所有程序员类招聘职位中职位需求最大的。如果你想做web开发或者企业级大型软件项目的开发,最好学习java,无论从当前热度和前景方面来看,都是非常不错的。同时,Java也比较容易学,在欧柏泰克许多自制力不强的同学通过4个月的java培训就能基本掌握入门知识。 Android现在待遇略低于Ios,但前景强于Ios 曾几何时,ios开发非常的火爆,开发人才供不应求,薪资待遇开的也非常的高,有一些刚刚具备1年工作经验的新手,都能拿到万元高薪,而同等资历的java程序员一般在5、6千元左右。由此,各大培训机构赶紧想法设法开设ios培训班,这几年过去了,Ios的开发热没有下降,而人才却比较饱和了,随着乔布斯的离世,曾经风风光光的苹果品牌也有所下降,而相反以三星手机为首的android系统却大放异彩,放眼以后,android的市场需求和空间要更广阔。 C/C++依然是钻研型程序员的首选 C/C++开发要难度大一些,因此大都是科班出身,尤其是名校毕 业的,因为从事C/C++开发,更讲究效率和性能,需要更多算法、数据结构的知识,实非普通人才适合从事的领域。如若想在该领域有所发展,则需要比较强的逻辑思维和钻研能力。 PHP老手待遇好,新手待遇却一般 目前大部分中小型网站都是PHP的,甚至很多庞大的电商系统也使用PHP实现,PHP的开源性使得PHP二次开发变得尤为流行。然而PHP开发却比较注重“量”了,目前许多公司使用PHP的目的就是为了省时省力,用最小的突入产生最大的产出。然而,只有PHP老手的待遇好,新手由于缺乏经验,很难有产出,因此待遇往往比较偏差。 总结 最后欧柏泰克老师认为整体来说可以从自身情况和对未来的规划出发考虑学习哪种语言,对于名校科班出身的钻研型人才,建议你学习C/C++,而对于普通的大中专毕业生等,建议从事anroid和JAVA领域。而对建站颇为感兴趣并不打算做一个纯粹的程序员,学习PHP也挺好。第五篇:做程序员学哪个编程语言发展前景比较好?