C:按顺序计算2个表达式,然后返回第一个

时间:2019-10-08 23:56:59

标签: c

在不牺牲清晰度的情况下,是否有更简洁的方法来重写以下功能?

function uint64_t pop_int(uint8_t** p, int num_bytes)
{
   uint64_t res = decode_int(*p, num_bytes);
   *p += num_bytes;
   return res;
}

我所能想到的只是

return decode_int((*p += num_bytes) - num_bytes, num_bytes);

但是如果该语言具有类似您可以使用的FIRST函数之类的东西,则会更清楚:

return FIRST(decode_int(*p, num_bytes), *p += num_bytes);

,但必须清楚,参数是按顺序求值的。

2 个答案:

答案 0 :(得分:2)

在C语言中,您编写的是用于解决任务的惯用代码。

在最终尝试的语言中,您可以使用它,它也许会更清晰。但是C没有此功能。

答案 1 :(得分:0)

终于找到了……我需要的语法是({... ; expr})(在linux内核的CIRC_SPACE_TO_END宏中使用)。 对于我的例子,我需要的是:

#define POST_INC(type, a, b) ({type* tmp = a; a += b; tmp;})

示例用法:

int main()
{
  char const* str = "hello, world";
  printf("%s\n", POST_INC(char const, str, 5));
  printf("%s\n", POST_INC(char const, str, 2));
  printf("%s\n", POST_INC(char const, str, 5));
}

结果:

hello, world
, world
world

很高兴我没有放弃!