分类: C/C++
2011-06-17 19:51:40
问:
我不知道真正的c会不会这么写?x=-m++我觉得应该是从右往左算~但是老师说是先求负再赋值再自加?那意思是后置自加得优先级再赋值后面?不懂啊!!那为什么m=m++是自加了才赋值呢?到底怎么算?
答:
x=-m++这个表达式没有任何问题,真正的C可以这样写。
优先级和运算次序是两个不同概念。优先级高未必就先运算,优先级低未必就后运算。
优先级描述的是表达式中各个运算符的运算对象是谁,优先级高的运算符先确定运算对象(操作数)。
以“x=-m++”为例,由于“++”的优先级最高,所以它的运算对象是m,表达式的含义是
x=-(m++)
“-”的优先级次之,因此表达式的意义可进一步明确为
x=(-(m++))
即(m++)这个子表达式的值是“-”的运算对象。(特别要注意辨析的是它的运算对象是m++的值而不是m,这个差别很大)
而(m++)的值就是m自加之前的值,求得这个值之后的副效应是m加了一个1。这个副效应是在求得(m++)的值之后完成的,很难说是否是在计算“-”(取负)之前还是之后完成的。但无论是在“-”(取负)之前还是之后都不影响-(m++) 。即,假设最初m的值为5,那么(m++)的值就是5,之后m再怎么加都不会影响已经求得的(m++)的值。这样(-(m++))就是-5(m的自加并不影响它)。
至于m=m++,本身是违背C语言原则的错误写法。详细解释见《狂人C》145页“4.总结”部分。