◇◇新语丝(www.xys.org)(xys3.dxiong.com)(www.xysforum.org)(xys2.dropin.org)◇◇   关于“Yush再说谭浩强大师的“赋值表达式”的一点看法   作者:epluspi   我没有读过谭的C语言教材,但从Yush所列举的两个例子来看,这本书确实 是有问题的。C语言是标准化进行的较好的语言,所以现在大家学习和使用C语言 的共识就是遵循标准。   象表达式(a=3*5)=4*3,C标准明确规定了赋值表达式返回右值,所以这个表 达式在对C语言是非法的。值得注意的是C++标准修改了这个规定,赋值表达式在 C++里返回左值(大概是为了照顾overloaded operator的效率),所以这个表达式 对C++是合法的。   至于a+=a-=a*a,不管谭怎么分析,都是错的。实际上不仅是第二个表达式, 连简单得多的(a=3*5)=4*3,表达式求值以后a的值都是未定义的。至于a+(虽然 这个表达式自身的值是12)。原因是:c/c++规定了一些序列点,比如'?',',', 等等。如果没有被序列点隔开,对同一个变量,一个表达式只能作一次写操作; 如果有多次写操作,谁先发生是未定义的。具体到这个表达式,对a进行了两次 写操作,一次写入15,一次写入12,无法确定最终a是多少。注意括号只能影响 表达式求值得顺序,并不能影响副作用(变量更新)的顺序。 (XYS20090315) ◇◇新语丝(www.xys.org)(xys3.dxiong.com)(www.xysforum.org)(xys2.dropin.org)◇◇