前言
在我刚刚开始学习编程的时候,经常分不清+=
和 =+
的区别,总是会忘记。现在学习编程很久了,我想我可以解释为什么编程语言中可以用 a+=b
表示a=a+b
,而a=+b
不可以了。
词法分析
在解释上面那个问题之前,我们该简单地了解一下词法分析。
百度百科:
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。 [1]
完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。
其实简单来说,词法分析就是用于分析编写代码中符号的具体意思,比如说 int a = 1, b=2;
中 =
意味着赋值,而if(a==b)
中的 =
是组成比较运算符 ==
的一部分。
词法分析中的’贪心法’
在实际编程中,我们遇到过单字符符号如+
、-
、*
、/
等单字符符号,分别对应加
、减
、乘
、除
等运算,也遇到过==
、===
等多字符符号,分别表示 是否相等
、是否全等
。当一个编译器读取字符=
后又跟了一个字符=
,那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号对待。
一般编译器而言,对于这类问题的解决方案就是:每个符号都尽可能的包含多个字符。也就是说,编译器将程序分解成符号的方法是:
从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
原因
有了上述的知识,我们再来看看我们最初的问题。
如果a=+b
表示a=a+b
,那么可以产生两种含义,
含义①
a=+b
中 =+
是一个符号,代表着 a=a+b
含义②
a=+b
中 =
是一个符号,代表着 赋值
,+
是一个符号,代表着数字的正负
,即表达式的含义为 a被赋值为正数b
,等价于表达式a = (+b)
根据词法分析的贪心规则,编译器会采取含义①。第一眼看过去,我们可能感觉这没什么问题,但是如果我们把变量b
改成数字10
,把+
,换成-
,我们就能发现一些问题:
a=-10
这具体是想表达 a
被赋值为-10
,还是代表着a = a-10
呢? 这种表达会让编程人员感到疑惑— —难以区分数字前的符号是操作符号还是正负号,从而增加编程人员开发时出错的概率。
总结
为了减少编程出差的概率,所以在设计的时候就规定了+=
、-=
、*=
、\=
、代表着一个多字节运算符,而 =+
会被认定为两个含义,=
赋值和+
数字的正负号。