请您解释一下反转字符串的以下函数的操作顺序吗?
//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循环,我就不知道它是如何工作的。具体是上面标出的线条。谢谢。
答案 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;
*right
*left
left
*right-- = tmp;
tmp
存储在*right
right
后缀增量/减量(++
/ --
)运算符的优先级高于解除引用(*
)。因此*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;
(实际订单可能会有所不同。)