strcpy中的指针赋值是如何工作的?

strcpy中的指针赋值是如何工作的?,c,pointers,C,Pointers,我正在看一个strcpy示例,其中它们增加指针的值,并将其分配到一行,如下所示: *ptrA++ = *ptrB++; 我知道指针在char数组中指向的值会增加,并且内容会被复制 c做了类似的事情吗 *ptrA = *ptrB; ptrA++; ptrB++; tmp1 = ptrA++; tmp2 = ptrB++; *tmp1 = *tmp2; ptrA++; ptrB++; *(ptrA - 1) = *(ptrB - 1); 在后台?你明白了。(15个字符)是的,记住后缀++意味

我正在看一个strcpy示例,其中它们增加指针的值,并将其分配到一行,如下所示:

*ptrA++ = *ptrB++;
我知道指针在char数组中指向的值会增加,并且内容会被复制

c做了类似的事情吗

*ptrA = *ptrB;
ptrA++;
ptrB++;
tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;
ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);

在后台?

你明白了。(15个字符)

是的,记住后缀++意味着返回增量之前的值。所以*ptrA++会增加ptrA,但会在增加之前返回ptrA的解引用。

是的,它会。因为代码使用后缀运算符:

后缀运算符是 是一个表达式的后缀

操作数++

这导致了 要返回的操作数。之后 计算结果表明,该方法具有较高的精度 操作数递增1

嗯,是和否

是的,因为您提供的第二段代码确实执行与原始代码相同的操作。因此,在某种程度上,您正确理解了原始代码

不,因为您的第二段代码实际上并不等同于原始代码。请记住,说后缀
++
运算符首先返回原始值,然后递增指针是不正确的。在C语言中,时间关系(发生在“之前”和“之后”)只能由序列点定义。表情

*ptrA++ = *ptrB++;
里面没有序列点,所以绝对没有办法说之前发生了什么,之后发生了什么。同时,您的第二个变体

*ptrA = *ptrB;
ptrA++;
ptrB++;
显式地保证增量发生在解引用之后,因为每个语句的末尾都有一个序列点。对于第一种变体没有这样的保证。这就是我认为你的解释有问题的地方

在现实中,很有可能先发生增量,然后再发生解引用。例如,编译器可以将原始表达式转换为

*ptrA = *ptrB;
ptrA++;
ptrB++;
tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;
ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);
在这种情况下,增量首先发生。或者编译器可以将其转换为

*ptrA = *ptrB;
ptrA++;
ptrB++;
tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;
ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);
在这种情况下,增量也首先发生

再一次,记住你对原始表达的解释是好的,但它只是可能的解释之一。永远不要假设事情会按照你在解释中使用的特定顺序发生


关于这些顺序点:,

是的,我刚刚注意到我问题上面的提示。在这两种情况下,编译器可能都可以进行指令重新排序。但是,是的,OP的原始方法可能会使它对于一个不太积极的优化编译器更加明显。这是一个整洁的编写过程。你能给我们指出序列点的定义吗?@Andres:请看回答中的P.S.部分对tmp1和tmp2片段的挑剔:说增量首先发生让我有点不知所措。在增加ptrA和ptrB之前,tmp1和tmp2的赋值仍在发生,但我承认这是显而易见的,但它可能会暂时混淆新的C代码。因此在现实世界中,我不能假设我的原始代码按我认为的方式工作,我应该先进行赋值,然后增加指针?