返回值时赋值

Assigning when returning a value

我不明白我的同事使用的功能。他不能 他正在使用奇怪的 return 方块。

block_t *get_block(void *p)
{
    char *tmp;
    tmp = p;
    return (p = tmp -= 16);
}

他说应该return表格和地址。

需要一些帮助来理解 return!非常感谢:)

所有 C 运算符都计算值(以 void 作为目标类型的强制转换运算符或对返回 void 的函数的函数调用除外)。特别是,赋值和 op/assignment 操作评估为分配的值。因此,这条语句:

    return (p = tmp -= 16);

相当于

    tmp -= 16;
    p = tmp;
    return p;

而后者正是 的写法 如果那是我想做的。将其全部压缩到一个表达式中会使代码更难被人阅读和理解,并且不会传达任何抵消优势。

但是,您的具体情况更糟。在您的情况下, ptmp 是函数的局部变量,因此对它们的赋值对调用者没有影响。因此,如果 p 之后不会被读回(从 p 中),则将新值分配给 p 是没有意义的。这可能反映也可能不反映编程错误。如果函数的实际行为是正确的,那么我会以不同的方式编写整个函数:

block_t *get_block(void *p) {
    return (block_t *) (((char *) p) - 16);
}

return 没有什么特别之处。它只是一个表达,就像在任何其他地方一样。

你可以重写如下:

block_t *get_block(void *p)
{
    char *tmp = p;
    p = tmp - 16;
    return p;
}

block_t *get_block(void *p)
{
    char *tmp = p;
    tmp -= 16;
    p = tmp;
    return p;
}

block_t *get_block(void *p)
{
    char *tmp = p;
    tmp -= 16;
    return (block_t *)tmp;
}

return 语句中的赋值在您从该函数 return 之后没有任何效果。

它所做的基本上是计算您提供的地址前 16 个字节的地址。 这可能是一些内存管理,您在给定用户的内存位置之前将一些数据存储在 header 中。

这很容易,但很不正确,不可移植且容易出错。

他提前 16 个字符获取地址并 returns A 它。他需要对 char 指针进行指针运算,因此他需要将其设为 char。不需要第二次赋值