【发布时间】:2010-12-19 07:14:42
【问题描述】:
我正在查看一个 strcpy 示例,其中他们增加了指针的值,并将其分配在 1 行中,如下所示:
*ptrA++ = *ptrB++;
我知道char数组中指针指向的值增加了,内容被复制了。
c 会做类似的事情吗
*ptrA = *ptrB;
ptrA++;
ptrB++;
在后台?
【问题讨论】:
-
是的,我刚刚注意到我的问题上方的提示。谢谢。
我正在查看一个 strcpy 示例,其中他们增加了指针的值,并将其分配在 1 行中,如下所示:
*ptrA++ = *ptrB++;
我知道char数组中指针指向的值增加了,内容被复制了。
c 会做类似的事情吗
*ptrA = *ptrB;
ptrA++;
ptrB++;
在后台?
【问题讨论】:
是的,记住后缀 ++ 表示返回增量之前的值。所以 *ptrA++ 递增 ptrA 但在递增之前返回 ptrA 的取消引用。
【讨论】:
嗯,是的,也不是。
是的,因为您提供的第二段代码确实与原始代码做同样的事情。所以,在某种程度上,你正确地理解了你的原始代码。
不,因为您的第二段代码并不真正等同于原始代码。请记住,说后缀++ 运算符返回原始值first 并增加指针later 是不正确的。在 C 语言中,时间关系(“之前”发生的事情和“之后”发生的事情)只能由序列点定义。表达式
*ptrA++ = *ptrB++;
里面没有序列点,所以绝对没有办法说之前发生了什么,之后发生了什么。同时,你的第二个变种
*ptrA = *ptrB;
ptrA++;
ptrB++;
明确保证增量发生在取消引用之后,因为在每个语句的末尾都有一个序列点。对于第一个变体,没有这样的保证。这是我认为您的解释有问题的地方。
实际上很可能会先发生增量,然后再发生取消引用。例如,编译器可以将您的原始表达式翻译成类似
tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;
在这种情况下,增量首先发生。或者编译器可以把它翻译成类似的东西
ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);
在这种情况下,增量也会首先发生。
再一次,记住你对原始表达的解释是好的,但这只是可能的解释之一。永远不要假设事情会按照您在解释中使用的特定顺序发生。
【讨论】:
是的,确实如此。因为代码使用的是后缀运算符:
后缀运算符是 以表达式为后缀。
操作数++;
这会导致 要返回的操作数。之后 结果得到,的值 操作数加 1。
【讨论】:
你明白了。 (15 个字符)
【讨论】: