【问题标题】:How to avoid using multiple "if then" for checking parameters?如何避免使用多个“if then”来检查参数?
【发布时间】:2013-06-05 08:48:36
【问题描述】:

我有一些代码应该做一件简单的事情:

如果参数的值为-1,那么我应该更改该值。 否则 - 什么也不做

我有一个包含 20 个参数的列表,但我想知道是否有任何方法可以不做检查:

如果 param1 == -1 那么...否则...

如果 param2 == -1 那么.... 否则...

有人知道我可以做些什么来提高效率吗? 谢谢!

【问题讨论】:

    标签: c if-statement switch-statement performance


    【解决方案1】:

    如果参数都是变量(不是数组什么的),可以做个函数写

    change_or_let_it_be( &param1, value );
    change_or_let_it_be( &param2, value );
    change_or_let_it_be( &param3, value );
    

    你只有一个 if (in function) 和很多调用。 最好将其存储在某种结构(数组、列表等)中,并避免调用此函数 20 次。

    【讨论】:

    • 您不需要传递指向函数参数的指针或返回可能更新的值吗?即change_or_let_it_be(&param1, value)param1 = change_or_let_it_be(param1, value);
    • 这只是一个提示,当然它需要以某种方式真正改变。
    • OP 会更清楚任何答案包括工作代码。您能否更新它以使用我建议的选项之一?
    【解决方案2】:

    不确定我是否理解你想要的,但是这个怎么样?

    void func(int params[20]) {
        for (int i = 0; i < 20; ++i) {
            if (params[i] == -1)
                params[i] = NEW_VALUE;
        }
    }
    

    使用 for 检查每个值,因此您不需要硬编码所有不同的值,然后在参数为 -1 时更改参数。另请注意,我假设“高效”是指代码编写时间效率更高!

    【讨论】:

      【解决方案3】:

      说实话,if/then 语句系列是最有效的,即使不是最漂亮的解决方案!将测试嵌入循环并将参数存储为数组需要以下额外计算:

      - testing that the loop counter does not exceed the maximum
      - incrementing the loop counter
      - using pointer arithmetic to access each parameter
      

      当然,如果您必须多次执行这 20 次测试,这些速度因素只是一个因素。但实际上你已经尽可能高效地编写了它:)

      【讨论】:

        【解决方案4】:

        另一种更清洁的解决方案:

        int *p[] = {&param1, &param2, &param3, NULL};
        int i = 0;
        for(;p[i] != NULL; i++) {
            if(*p[i] == -1) *p[i] = SOME_VALUE;
        }
        

        【讨论】:

          猜你喜欢
          • 2016-01-29
          • 1970-01-01
          • 2020-10-19
          • 1970-01-01
          • 2019-09-07
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          相关资源
          最近更新 更多