Все операторы C вычисляют значения (кроме оператора приведения с void
в качестве целевого типа или вызова функции, возвращающей void
).В частности, операции присваивания и оп / присваивания оцениваются по присвоенному значению.Следовательно, это утверждение:
return (p = tmp -= 16);
эквивалентно
tmp -= 16;
p = tmp;
return p;
И последнее точно так же, как I будет писатьэто если это то, что я хотел сделать.Сжатие всего этого в одном выражении усложняет чтение и понимание кода человеком и не дает никаких компенсирующих преимуществ.
ОДНАКО, ваш конкретный случай еще хуже.В вашем случае p
и tmp
являются локальными переменными функции, поэтому их присвоение не влияет на вызывающую функцию.Поэтому нет смысла присваивать новое значение p
, если оно не будет впоследствии считываться (с p
).Это может отражать или не отражать ошибку программирования.Если реальное поведение функции корректно как есть, тогда я написал бы всю функцию совсем по-другому:
block_t *get_block(void *p) {
return (block_t *) (((char *) p) - 16);
}