不知道评估的顺序是否无法将源字符串复制到给定用户定义函数中的目标字符串?

时间:2017-05-19 22:09:31

标签: c string pointers operator-keyword operator-precedence

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错过源字符串的第一个字符?

但是,该函数似乎成功地将源字符串的内容复制到目标字符串的末尾。

3 个答案:

答案 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);

因为预增量会增加变量并计算新值,即下一个位置。

请参阅What is the difference between ++i and i++?

答案 2 :(得分:0)

重要的是要注意,后缀增量或减量表达式在应用相应运算符之前求值为表达式的值。在计算操作数之后发生递增或递减操作。请参阅:Postfix Increment and Decrement Operatorsconfusion regarding *(asterisk) and ++ in c