编程语法分析之从表达式说起
0赞表达式,一般有操作数和操作符组成。要问表达式和语句的区别,百度截取的一个回答:
在c语言中,分号“;”是语句结束的标志,就相当于中文中的句号。表示一条语句的结束。反过来,“;"是语句的象征,本身 ";"就表示一条语句,称为空语句,一般用于占位。比如while (1) ; ;
第1个分号表示的是空语句,第2个分号表示的是语句结束符。主要区分表达式和语句的区别,在C语言中带分号的就是语句,不带分号的即为表达式。
而在Accelerated C++ 一书中说到:“当一个表达式后面紧跟一个分号时,就表明系统让我们丢掉这个返回值 ”见第《Accelerated C++》0章的第7节。
也就是说,表达式从宏观上讲具体两大作用:
1、表达式一定会返回一个值!(有且只有一个值)
2、整个表达式在计算时产生的变化。这个作用往往别称之为表达式的副作用!
于是我想了到宏,宏就没有分号,如:带参数的宏还能像函数一样返回一个值!结合表达式的第一个作用就很好理解了。
还有在if判断里也是(没有分号的)表达式,如if(1+(a = b -1))这个表达式看起来奇葩,但是也是符合语法的。a = b - 1就是一个表达式,他其实就一个值!只不过这个表达式的返回值和a的值是一致的。所以很多复杂的表达式如果你将其看成一个值,就会简化不少。当然如何看,必须结合“优先级”以及“结合律”来看了。具体内容请看下节,《编程语法分析之“优先级”和“结合律”》。
再联想一下函数,函数分为有返回值和没有返回值的函数。
一、有返回值的函数和“表达式”一样,有两大作用:
1、有返回值的函数一定会返回一个值!(有且只有一个值)
2、整个函数内容在计算时产生的变化。
二、没有返回值的函数就好比“语句”不在结果,而在乎过程中发生的变化。
我在百度上找到一个回答,深以为然:
于是乎,有了一点感悟:(题外话)
一个问题想不通,无外乎两点:
1、没有认清本质
2、需要根据条件,分类讨论(总有例外)