void mystrcat(char* dest,char* src)
{
while(*dest) dest++;
while(*dest++=*src++);
return;
}
上面的代码块是一个用户定义的函数,用于将字符串的内容复制到另一个字符串的末尾
在这里,我们遍历目标字符串,直到它到达空字符'\0'
。第二个while循环应该用于将源字符串的内容复制到目标字符串的末尾。
我已经读过,根据C中运算符的优先级表,诸如*ptr++
之类的表达式被评估为*(ptr++)
。
如果是这种情况,则不应将表达式*dest++=*src++
评估为
*(dest++)=*(src++)
?
不会导致dest首先指向内存中的下一个位置并更新其值,而不是使用源字符串中的字符更新'\0'
?同样,它不会导致src
错过源字符串的第一个字符?
但是,该函数似乎成功地将源字符串的内容复制到目标字符串的末尾。
答案 0 :(得分:1)
使用postfix ++
运算符,操作数在之后递增,在当前上下文中计算它。在此表达式中,取消引用dest
的当前值,并将分配给的位置和src
的当前值取消引用,并将值分配给左侧。
来自C standard的第6.5.2.4节:
2 后缀
++
运算符的结果是操作数的值。作为副作用,操作数对象的值 增加(即,添加适当类型的值1) 它)。参见附加运算符的讨论和 关于约束,类型和的信息的复合赋值 转换和操作对指针的影响。的的 结果的值计算在侧面之前排序 更新操作数存储值的效果。有 尊重不确定顺序的函数调用, postfix++
的操作是单一评估。 Postfix++
具有原子类型的对象是一个读 - 修改 - 写操作memory_order_seq_cst
内存顺序语义。
所以这个:
*dest++=*src++
与(大致)相同:
*dest=*src;
dest+=1;
src+=1;
答案 1 :(得分:0)
您遗失的是*dest++
使用帖子 -increment。这意味着表达式dest++
在递增之前返回值,这是我们用*
取消引用的指针。所以它分配给内存中的当前位置,然后递增指针。
*dest++ = *src++;
实际上相当于:
*dest = *src;
dest++;
src++;
如果你写了:
,你所描述的问题就会发生*(++dest) = *(++src);
因为预增量会增加变量并计算新值,即下一个位置。
答案 2 :(得分:0)
重要的是要注意,后缀增量或减量表达式在应用相应运算符之前求值为表达式的值。在计算操作数之后发生递增或递减操作。请参阅:Postfix Increment and Decrement Operators和confusion regarding *(asterisk) and ++ in c