C 指针的操作顺序
您能解释一下以下反转字符串的函数的操作顺序吗C 指针的操作顺序,c,string,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
//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;
}
//http://www.perlmonks.org/?node_id=589993 方法来源
/*将字符串反转到位,返回str*/
静态字符*反向(字符*str)
{
char*left=str;
char*right=left+strlen(str)-1;
char-tmp;
while(左<右)
{
tmp=*左;
*left++=*right;//这部分真的很混乱……赋值后会发生++?
*右--=tmp;//这个也一样糟糕
}
返回str;
}
我可以很容易地遵循方法中的前3行,但是一旦它进入while循环,我就不知道它是如何工作的。特别是上面标记的行。多谢各位
*left++ = *right
在该语句中,*left
被赋值为*right
,然后在所有这些赋值之后,left
(不是*left
)被递增。同样的逻辑适用于*右侧--
重写后的伪代码是这样的:
while(not halfway)
{
tmp = left value
left value = right value
left position += 1
right value = tmp
right position -= 1
}
在该语句中,*left
被赋值为*right
,然后在所有这些赋值之后,left
(不是*left
)被递增。同样的逻辑适用于*右侧--
重写后的伪代码是这样的:
while(not halfway)
{
tmp = left value
left value = right value
left position += 1
right value = tmp
right position -= 1
}
后减量运算符发生在取消引用之后,并且在赋值之后(在代码中)非常有效。后减量运算符发生在取消引用之后,并且在赋值之后(在代码中)非常有效。要理解代码,请在代码中添加括号:
*left++ = *right;
同:
*(left++) = *right;
*left = *right;
left++;
换句话说,++应用于指针,而不是指针指向的对象
由于这是增量后运算符,副作用在使用left
的值后发生。换句话说,这与:
*(left++) = *right;
*left = *right;
left++;
为了理解代码,如果在代码中添加括号,则更容易理解:
*left++ = *right;
同:
*(left++) = *right;
*left = *right;
left++;
换句话说,++应用于指针,而不是指针指向的对象
由于这是增量后运算符,副作用在使用left
的值后发生。换句话说,这与:
*(left++) = *right;
*left = *right;
left++;
你明白了
*left++ = *right;
*右侧
*左侧存储(1)
tmp
存储在*右侧
右侧
++
/--
)运算符的优先级高于取消引用(*
)。因此,*left++
被解析为*(left++)
。作为增量后操作,增量发生在该序列之后(即,分配发生之后)。您得到了它
*left++ = *right;
*右侧
*左侧存储(1)
tmp
存储在*右侧
右侧
++
/--
)运算符的优先级高于取消引用(*
)。因此,*left++
被解析为*(left++)
。作为增量后操作,增量发生在该序列之后(即分配发生之后)。此行:
*left++ = *right;
有两个副作用:left
递增以指向它所指向的数组的下一个元素,并且从地址right
读取的值存储在递增之前指向的位置left
。但是,指针变量left
的存储是在指针变量指向的字符的存储之前还是之后进行的,没有定义顺序。此行:
*left++ = *right;
有两个副作用:left
递增以指向它所指向的数组的下一个元素,并且从地址right
读取的值存储在递增之前指向的位置left
。但是,指针变量left
的存储是在指针变量指向的字符的存储之前还是之后进行的,没有定义顺序。后缀运算符(包括++
和--
)的优先级高于一元运算符(例如*
)。因此,表达式*p++
被解析为*(p++)
,因此*
应用于p++
的结果
所以
相当于
*left = *right;
left++;
后缀运算符(包括++
和-->
)的优先级高于一元运算符(如*
)。因此,表达式*p++
被解析为*(p++)
,因此*
应用于p++
的结果
所以
相当于
*left = *right;
left++;
作业完成后会发生吗?
不。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;
(实际顺序可能会有所不同。)作业后是否会发生++?
不。p的增量可能发生在赋值之前,但这在这里并不重要
重要的一点是赋值只能看到p
增加之前的值p
p++
返回的p
比多!x
返回x
p++
返回p
的原始值,其行与
TYPE* post_inc(TYPE* p) {
TYPE* tmp = p;
++p;
return tmp;
}
总的来说,它看起来有点像