指针的操作顺序

时间:2011-04-26 20:01:26

标签: c string

请您解释一下反转字符串的以下函数的操作顺序吗?

//http://www.perlmonks.org/?node_id=589993 source of method
/* reverse a string in place, return str */
static char* reverse(char* str)
{
    char* left  = str;
    char* right = left + strlen(str) - 1;
    char  tmp;
    while (left < right)
    {
        tmp      = *left;
        *left++  = *right;//This part is real confusing...Does ++ happen after the assignment?
        *right-- = tmp;//This one is just as bad
    }
    return str;
}

我可以非常轻松地遵循方法中的前3行,但是一旦它遇到while循环,我就不知道它是如何工作的。具体是上面标出的线条。谢谢。

7 个答案:

答案 0 :(得分:4)

*left++  = *right

在此声明中,*left被分配*right,然后在所有left(不是*left)之后递增。 *right--

采用相同的逻辑

如此重写,伪代码就是这样:

while(not halfway)
{
    tmp = left value
    left value = right value
    left position += 1
    right value = tmp
    right position -= 1        
}

答案 1 :(得分:0)

后递减运算符在取消引用后发生,并且在赋值后有效(在代码中)。

答案 2 :(得分:0)

要理解代码,如果为其添加括号,则更容易:

*left++  = *right;

与:

相同
*(left++) = *right;

换句话说,++应用于指针,而不是指针指向的位置。

由于这是后增量运算符,因此在使用left的值之后会发生副作用。换句话说,这与:

相同
*left = *right;
left++;

答案 3 :(得分:0)

你明白了。

*left++  = *right;
  1. 取消引用*right
  2. *left
  3. 处存储(1)
  4. 增量left
  5. *right-- = tmp;
    
    1. tmp存储在*right
    2. 减少right
    3. 后缀增量/减量(++ / --)运算符的优先级高于解除引用(*)。因此*left++被解析为*(left++)。作为后增量操作,增量发生在该序列之后(即,在赋值发生之后)。

答案 4 :(得分:0)

这一行:

*left++ = *right;

有两个副作用:left递增以指向它指向的数组的下一个元素,从地址right读取的值存储在left位置在增量之前指向 。但是,对于指针变量left的存储是否在存储到它指向的字符之前或之后发生了定义。

答案 5 :(得分:0)

后缀运算符(包括++--)的优先级高于一元运算符(例如*)。因此,表达式*p++被解析为*(p++),因此*将应用于p++结果

所以,

*left++ = *right;

相当于

*left = *right;
left++;

答案 6 :(得分:0)

分配后是否会发生++?

没有。 p的增量可能在分配发生之前发生,但这在这里并不重要。

重要的是,作业只会在p递增之前看到p之前的值。 p++不再返回p而不是!x返回x

p++返回p的原始值与

相同的行
TYPE* post_inc(TYPE* p) {
   TYPE* tmp = p;
   ++p;
   return tmp;
}

总之,它看起来像:

    tmp = *left;

    anon0 = left;
    ++left;
    *anon0 = *right;

    anon1 = right;
    --right;
    *anon1 = tmp;

(实际订单可能会有所不同。)