返回值时赋值
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;
而后者正是 我 的写法 如果那是我想做的。将其全部压缩到一个表达式中会使代码更难被人阅读和理解,并且不会传达任何抵消优势。
但是,您的具体情况更糟。在您的情况下, p
和 tmp
是函数的局部变量,因此对它们的赋值对调用者没有影响。因此,如果 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。不需要第二次赋值
我不明白我的同事使用的功能。他不能 他正在使用奇怪的 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;
而后者正是 我 的写法 如果那是我想做的。将其全部压缩到一个表达式中会使代码更难被人阅读和理解,并且不会传达任何抵消优势。
但是,您的具体情况更糟。在您的情况下, p
和 tmp
是函数的局部变量,因此对它们的赋值对调用者没有影响。因此,如果 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。不需要第二次赋值