Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229379
  • 博文数量: 39
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 453
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-26 15:54
文章分类

全部博文(39)

文章存档

2012年(1)

2011年(31)

2010年(7)

分类: 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.总结”部分。

阅读(2056) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~