以下两个功能是否相同?如果没有,为什么不呢?

时间:2017-02-06 16:05:10

标签: c string function pointers char

void s1(char dest[], char src[])
{
    int i=0;
    while(dest[i++]=src[i++]);
}

void s2(char * dest, char *src)
{
    while(*dest++=*src++);
}

另外,请注意我从一本书中解决了这个问题,并且不知道代码是否正确(我认为在while循环中应该有两个'=')

2 个答案:

答案 0 :(得分:5)

第二个代码执行字符串复制。它相当于strcpy()

第一个代码具有未定义的行为,因为它在一个语句中两次更新i而没有插入序列点。

所以答案是它们不一样。

第一个代码可以更正。例如:

void s1(char dest[], char src[])
{
    int i=0;
    while(dest[i]=src[i]) i++;
}

答案 1 :(得分:0)

首先是这些函数声明

void sh1(char dest[], char src[]);

void s2(char * dest, char *src);

是等价的,因为声明为数组的函数参数被调整为指向具有与数组元素类型对应的类型的对象的指针。

您甚至可以在一个编译单元中包含具有相同名称的函数的两个声明,并且它们将声明相同的一个函数(尽管函数定义必须是一个,只要该函数不是内联函数)。

所以问题是关于循环中使用的表达式是

while(dest[i++]=src[i++]);

while(*dest++=*src++);

产生相同的结果。

第一个循环有未定义的行为。你应该像

一样重写它
while(dest[i] = src[i]) i++;

例如dest++增加指针,可以像dest = dest + 1一样重写它。因此,将操作符++多次应用于指针,您将得到它等同于表达式dest = ( dest + 1 ) + 1 + ... +1; Ot它可以写成dest = dest + i;,其中i是{{1}的总和}}

因此,对于循环的每次迭代,这些表达式

1 + 1 ...+ 1*dest++

产生相同的结果。