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