onemoo
读表达式的时候,始终要记住些基本概念:运算符、操作数、表达式、运算符的优先级和结合性。复杂的复合表达式不过是多个简单表达式的组合而已,心里清楚这些,分析起来就简单了。粗略说一下:运算符是要和操作数一起用的,或者说运算符是施于操作数的,运算符和操作数合在一起构成了一个表达式,多个表达式连在一起形成复合表达式。* ++ 都是运算符,并且它们都是一元运算符,也就是它们只需要一个操作数。多个运算符连在一起时先算哪一个呢? 是按照运算符的优先级而定的。如果多个运算符是同一优先级的呢?那就按照运算符的结合性来算,也就是从左向右或从右向左算。这里 ++ 的优先级要高于 *,所以 p++ 要先算,也就是说这个表达式相当于 *(p++)。这里的括号你应该知道是什么意思吧?就是明确指明优先顺序(也就是忽略优先级规定,让括号中的先算),当然因为 ++ 就是优先于 * 的,所以实际上不用写上这个括号还要说一点:表达式本身是有值的(当然也就有相应的类型)。以 *(p++) 表达式为例,前面说 p++ 先算,也就是会得出 p++ 表达式的值,然后再算 * 表达式的值。* 表达式的运算符当然就是 * 了,它的操作数就是这个 p++ 表达式的值…… 复合表达式就是这样由多个简单表达式连起来的。还有些更琐碎的内容,不过不影响分析这个表达式,我就先不说了。具体来分析这个 *p++ 表达式:先算 p++ 表达式。我说过每个表达式都有值,那么 p++ 表达式的值是什么呢——就是 p 的值。再算 * 表达式。 * 运算符的作用是“解引用”它的操作数(操作数必须是指针类型),所以 * 表达式解引用的就是 p,也就是会得到 p 所指的变量。你发现了吗?我这里的描述都是在说“表达式的值”什么的,尤其是提到 ++ 表达式也是如此,我根本没提“自增”。这就是我想先让你记住的:表达式在参与运算时都是在使用“表达式的值”。那么自增什么的呢? 那就是表达式的第二个作用:某些表达式除了有本身的值以外,还有“副作用”。比如 p++ 表达式的副作用就是使其操作数自增 1,也就是之后 p 会自增 1。注:这个“之后会自增”到底是什么时候呢?这个话题也很复杂,由于对这个例子没有影响,我就不展开说了。再说一遍:不管运算符有什么样的副作用,参与复合表达式运算的永远都是“表达式的值”。当然,这个 *p++ 表达式运算完——也就是得到了 p 在自增前所指的变量。此外,由于 ++ 的副作用,p 会自增 1。 也就是课本中的那句“先取p所指变量的值,后地址加一”。 其实较真地说,这句也不太准确,应该是“取 p 所指的变量,又将 p 自增 1”。而你说的“先取p所指变量的值,后变量值加一”,这其实是 (*p)++ 表达式的行为。 你试试分析看看是不是这样。