【问题标题】:Are the following two functions equivalent? If not, why not?以下两个函数是否等效?如果不是,为什么不呢?
【发布时间】:2017-06-23 15:40:09
【问题描述】:
void s1(char dest[], char src[])
{
    int i=0;
    while(dest[i++]=src[i++]);
}

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

另外,注意这个问题我是从一本书里拿出来的,不知道代码是否正确(我认为while循环中应该有两个'=')

【问题讨论】:

  • 几行代码;您不能在发帖前至少尝试并正确格式化吗?
  • @Akos Nagy,Re "我认为 while 循环中应该有两个 '='",不,那么它不会复制任何内容。这些功能是(尝试)重新实现strcpy
  • @minigeek,Re“它基本上是一个无限循环,因为它是=”,不,它在复制NUL后停止。这些功能是(尝试)重新实现strcpy
  • 书上没告诉你吗?

标签: c string function pointers char


【解决方案1】:

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

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

所以答案是它们不一样。

第一个代码可以更正。比如这样:

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

【讨论】:

    【解决方案2】:

    对于初学者来说,这些函数声明

    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; 其中i1 + 1 ...+ 1 的总和

    所以对于循环的每次迭代,这些表达式

    *dest++dest[i], i++

    产生相同的结果。

    【讨论】:

    • 不幸的是,dest[i++]=src[i++] 正如 Klas 指出的那样是 UB。
    • @bolov 哦,我什至没有看到索引增加了两倍。:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2022-08-24
    相关资源
    最近更新 更多