回顾这几年学习编程有感而写
热身
对很多CS专业的同学来讲,C语言 会是你们接触的首门编程语言。之后可能会进阶难度更大,经过面向对象扩充的C++,或其他什么高级面向对象语言。在这之前,可能你完全是个新手,还没怎么正式接触过编程。作为一名一路走来的老司机,我想跟大家聊聊我当年入门编程时遇到的一些坑,希望我的文章能为你保驾护航,使你免于翻车。
我深知让编程新手们最痛苦的事便是调试代码时被 IDE 高亮提示的满屏错误给闪瞎了眼(多数新手最初的几行代码可能始于独立的编辑器,比如笔者在 Win 上必备的 NotePad++ 等等。还有就是新手们最常犯的一般是语法错误)。这其实很正常,可能你现在连盲打都不熟练,可能你现在只对 WSAD 和 IJKL 这几个按键比较熟练,什么面向过程,面向对象,甚至面向函数等等概念你都还搞不清楚……别着急,后面的路长着呢,长到足够你适应用十根手指敲击所有按键,长到你不会再被语法错误所困扰(因为有更麻烦的逻辑错误在前方等着你,等到被逻辑错误折磨成为常态的那天,你会觉得自己再偶尔犯个语法错误是件很可爱的事~)。
正题
下面我们直接切入正题:
首先本篇文章格局较小,我只以 C语言 为讨论对象聊一些 C语言 新手们常犯的错误(主要是语法错误),后面会涉及一些编程新人们应该具备的基本思想觉悟。另外,本篇文章所讨论的内容十分初级,对编程新人来说可能比较受用,但对老司机可能太过浅薄!不过老司机读这样的文章兴许也能勾起一些早年的学习回忆,希望能博君一笑。下面开始分点讨论:
1. 忘写分号
在 C语言(包括很多 类C语言)里,让很多新手们感觉最反人类的一点大概就是每条语句结尾要以分号 “;” 标示,而对这个超级重要的分号,萌新们初期通常是能忘写就忘写……这样的低级错误单独拿出来说可能显得很滑稽,然而你仔细回想下,你现在或当年确实经常把人家分号给忘掉,对吗?
其实还好,基本上代码写多以后就不存在这样一个低级错误了。初期你可能要先忍受下因为少写了一个分号导致编译不通过的尴尬情况,别着急,回头补上可能编译器就给你通过编译了。说来,这也是最容易排查的一个错误你说是吧。
#include <stdio.h>
void main(){
printf("Hello World!\n"); //注意分号
}
2. = 和 == 混淆
新手们通常需要一点时间才能理解编程语言中的赋值运算符,敲黑板了!!!注意字符 “=” 在大多数编程语言中是个跟你往常经验有所不同的重要符号,一般被我们称之为“赋值运算符”。这是一个在编程中非常重要的运算符。它具有右结合性,计算的时候是先计算出表达式右边的值,然后再把计算好的右边存储的值赋予左边的变量。计算完成后左右两边其值自然是相等的。注意这个符号的左边只能是变量,因为只有变量才可以被赋值。不要试图把一个常量放在赋值运算符的左边,这会通不过编译的!
“==” 是关系运算符的一种,我们使用这个符号来判断左右两边表达式的值是否相等,其结果是个逻辑值。当然在 C语言 中因为没有提供布尔型数据,所以我们只是简单地用整数 1 来表示 True ,用整数 0 来表示 False。
#include <stdio.h>
void main(){
//下面三句都是赋值操作
int a=1;
int b=2;
a=b;
//下面的括号里是使用关系运算符的关系表达式,此处用来比较两个变量的值是否相等,这里是相等的,返回整数 1
int c=(a==b);
printf("%d",c);
}
你可能会奇怪我为什么要把这两个基本运算符放一起说道,别急。据我经验,这里也有个新手频繁翻跟头的大坑,那就是容易把这两个运算符搞混。
最常见的一个误操作,就是在进行两个表达式值比较的时候,本来正确的关系表达式应该是 a==b ,然而新生们可能会误写为去判断 a=b ,这……这个错误笔者在今天也会偶尔犯!所以啊,新人们一定要好好跟着两个重要的运算符认识清楚,确保在使用的时候不会混淆,谨记!
3. 注意语言的保留关键字
这个就很容易理解了,新手们普遍敲的代码比较少,注意一些语言的保留关键字一定要敲对了,避免拼写错误。有时候一个键入错误的关键字会报一些难以理解的错误,一定要尽量避免。还有就是变量命名的时候不要使用语言的保留关键字,你懂的!下面贴一下 C语言 的保留关键字,内容来自互联网:
其中,C89中,(C语言标准)中
类型说明保留字:int,long,short,float,double,char,unsigned,signed,const,void,volatile,enum,struct,union
语句定义保留字:if,else,goto,switch,case,do,while,for,continue,break,return,default,typedef
存储类说明保留字:auto,register,extern,static
长度运算符保留字:sizeof
4. 成对符号一定要包住
所谓成对符号,指的是只要出现一定是成对出现的那些符号。比如常见的各种括号,在 C语言 里主要有花括号 {},方括号 [],圆弧括号 (),这三个最为常见。其他的成对符号还有引号,主要有双引号和单引号。成对符号常见的差不多就这些,这里说的成对符号一定要包住是指成对符号一定要成对出现。比如你不能只写一个花括号的其中一半 “{”,而把另一半 “}” 给忘了。这其实也是个典型的低级错误,之所以单独拿出来讲是因为当程序写的复杂起来嵌套结构变多之后这些成对符号很容易写着写着就把另一半给忘掉了。有时候,在嵌套结构多的程序段里一组成对符号没包住会出现些匪夷所思的错误提示,这基本是新人们最容易翻跟头的地方,大家一定要小心!
5. 对某些概念不要钻牛角尖
初学者在初期接受一些概念性东西的时候往往容易陷入钻牛角尖而不得的尴尬境地,比如 C语言 里的指针。指针应该是令 C语言 初学者最为困扰的一个概念,因为这是 C语言 中一个完全抽象性的概念 。所谓抽象性概念,一定要用你的抽象思维去理解,很多抽象性概念是不容易具象表达出来的。
往远一点说开去,所有的高级语言其实都是计算机和人之间隔着的一层抽象关系。要知道计算机内部实现逻辑是很抽象的,它内部只认识 0 和 1 ,而我们的现实世界是很复杂的。计算机就是发明出来帮我们人类处理现实问题的,而现实问题映射到计算机里只能简化成二进制的 0 和 1 来表示,进而去计算。编程语言在这里所起到的作用其实就是连接计算机的内部抽象实现和我们人类的抽象思维,说到这里,你的抽象思维还算过关吗?
具体到指针这个概念,其实初学者不用在初学阶段去死磕它到底是什么,只需要记住课本上一句关于指针的描述性概念:一个变量的地址称为该变量的指针。目前记住这句话就够了。
6. 学习要沉得住气,切勿心浮气躁,急于求成
本篇文章主要是面向大学 CS 专业新生群体里的编程初学者聊一些过来人的经验。当然你即使不是大学新生,只要满足编程初学者的设定,本篇文章所聊到的东西对你来说仍然是适用的。到文章末尾了,我最后再说一下要做好编程这件事应该具备的一些心态,以及给新人同学们的一些寄语。
可能你在学习了很长一段时间后成果仍仅限于在黑洞洞的终端窗口输出一些看似意义不大的字符。你可能会怀疑,会动摇,自己的努力仿佛都是无意义,或者说无用的。毕竟,在终端窗口里输出一句 Hello World ! 这件事从表面上看确实没什么意义。你可能会想当然地觉得编程这件事本身就没什么意义,能解决的好像都是些无用的问题。其实要解决这个疑惑涉及到的问题很深刻,甚至牵扯到编程的本质是什么这种元问题……好啦扯远了!我非常理解这些疑惑,因为我也曾一度被这样的问题困扰着。其实基础的编程教学都不会教初学者玩 GUI,就是图形用户界面。但编程最基础的,也是最本质最需要解决的东西,就是“如何高效快速地算出两个数相乘之积”这些看似简单的问题。给一些具体问题套上 GUI,问题会变得更为复杂点,但拆开来看仍是由很多很多“如何高效快速地算出两个数相乘之积”这些看似简单的问题组成的。那些复杂花哨的 GUI 程序,起点都是“如何在终端打印 Hello World !”,“如何高效快速地算出两个数相乘之积”,这些简单的问题!所以,年轻人,学习要沉得住气!学校教的,或者说基础教学教你的,都是看似简单,却基础重要的多的东西。越是基础的东西,就越是不容易过时,越是你应该珍惜,会使你终身受用的东西!
完!