我正在看一个strcpy示例,它会增加指针的值,并将其分配为1行,如下所示:
*ptrA++ = *ptrB++;
我知道指针在char数组中指向的值会增加,并且内容会被复制。
做c之类的事情
*ptrA = *ptrB;
ptrA++;
ptrB++;
在后台?
答案 0 :(得分:7)
是的,记住postfix ++意味着在增量之前返回值。所以* ptrA ++递增ptrA但在递增之前返回ptrA的解除引用。
答案 1 :(得分:7)
嗯,是的,没有。
是的,因为您提供的第二段代码确实与原始代码完全相同。因此,在某种程度上,您可以正确理解原始代码。
不,因为您的第二段代码与原始代码并不完全相同。请记住,说postfix ++
运算符首先返回原始值 并稍后递增指针是不正确的。在C语言中,时间关系(“之前”发生的事情和“之后发生的事情”)只能由序列点定义。表达式
*ptrA++ = *ptrB++;
里面没有序列点,所以绝对没有办法说出之前发生的事情以及之后发生的事情。同时,你的第二个变种
*ptrA = *ptrB;
ptrA++;
ptrB++;
明确保证在取消引用后发生增量,因为在每个语句的末尾都有一个序列点。对于第一个变体,没有这样的保证。这就是我认为你的解释存在的问题。
实际上,增量将很可能首先发生,并且取消引用将在稍后发生。例如,编译器可以将原始表达式转换为类似
的内容tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;
在这种情况下,首先发生增量。或者编译器可以将其转换为类似
的内容ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);
在这种情况下,增量也会先发生。
再一次,记住你对原始表达的解释是好的,但这只是可能的解释之一。永远不要认为事情会按照您在解释中使用的特定顺序发生。
答案 2 :(得分:2)
是的,确实如此。因为代码使用的是后缀运算符:
后缀运算符是运算符 是表达式的后缀。
操作数++;
这会导致值 要返回的操作数。之后 得到的结果,价值 操作数加1。
答案 3 :(得分:1)
你明白了。 (15 char)