主题:[讨论]运算符优先级问题
与天比高
[专家分:40] 发布于 2011-03-02 10:13:00
在看一些字符串问题的时候,经常出现这样的语句, *tmp++ = *p;比如tmp和p是指向数组元素的指针,那么这个语句的执行顺序是怎样的呢?正确的理解是*tmp,将*p赋给*tmp后tmp++。但是我不是很理解,*和++优先级是一样的。那么在=左边是从左到右执行,先*tmp后tmp++,那么*p是赋给++后还是++前呢??
回复列表 (共2个回复)
沙发
windy0will [专家分:2300] 发布于 2011-03-02 13:24:00
楼主,您应该好好了解下,优先级,结合方向,执行顺序。这写都是不同的。
++ *虽然优先级一样,但它是右结合的。故*temp++ 等价于*(temp++),而不是(*temp)++ 。优先级是相对于不同类型运算符而言,结合方向是相对于同一优先级的不同或相同运算符而言。但执行顺序和上面两者无明显关系。*temp++ = *p是无法确定先计算等号左边还是右边,甚至同时计算。c标准是没有严格规定,也完全没必要规定,会影响代码执行效率。把这个问题完全解释清楚,也不是三言两语能讲明白,如果您还有什么疑问,再提出来。
板凳
bao0604 [专家分:0] 发布于 2011-03-02 15:43:00
楼主可以这样去看。
因为在这个语句里面,*和++是同一优先级别,*tmp++=*p 等价于 *(tmp++)=*p加上括号,显得更有条理了。
p是一个指针变量,指向某一数据的地址。加上*就意味着p要取这个地址里面的内容。
tmp和p是同一种性质,也是指针变量。只不过p取到内容后复制给tmp所指向的地址空间。赋值后,*tmp即取“++”前的tmp中的内容。
我来回复