动态if then语句用于简单算术和重置计数器

时间:2014-12-18 19:26:48

标签: c refactoring

我写了很多像这样的代码

int x = 0;

//in some loop
x++;
if (x > 10) {
  x = 0;
  //call some function
}

我怎样才能将它提取到函数或宏中,我可以将递减(或递增),超过(或低于)的值,复位值(在本例中为0)和函数调用组合在一起?

编辑:

我喜欢做(伪代码)

之类的事情

cycle_counter(x, ++, <10, 0, myfunc);

2 个答案:

答案 0 :(得分:1)

#define SATURATE_ADD(x, max, inc, reset) ((x) = (x) > (max) ? (reset) : (x) + (inc))

并在您的示例中:

int x = 0;

SATURATE_ADD(x, 10, 1, 0);

如果你想调用某个函数,只需添加一个你将在宏中调用的函数参数。

答案 1 :(得分:0)

我尝试创建一个函数来解决类似于伪代码

中的函数的问题
void cycle_counter(int *px, char operatorr, int max, int init, void (*p)())
{
   *px=init;

   //in some loop

   operatorr?(*px)++:(*px)--;    //if the operator is 0 we usee -- otherwise ++

   ((*px)>max)?((*px)=0,p()):0; // This line replaces the if statement in your 
                                // code and the callback
}

所以我们在这里使用了指向px的名为x的指针,以便它可以保留更改

运算符operatorr是一个布尔值,对--++取值 0 ,否则

max是一个整数,将提供用于比较。在您的示例中,它将 10

init用于初始化指针px

指向的整数

最后p引用指向函数的指针

现在,如果您想在main函数中调用此函数,您将继续这样做

 cycle_counter(px, 1, 10, 0, myfunc);
带有px

int x;
int *px=&x;

有一些例外没有得到处理,但我已经尝试制作难以处理 指向函数的指针 的部分。另一部分(未完成&gt;和&gt; =)很容易让三元运算符处理所有情况变得更加复杂但你可能会得到一个可爱的行,可以被视为混淆 line;)