2013-06-05 67 views
3

我有一些代碼應該做一件簡單的事情:如何避免使用多個「if then」來檢查參數?

如果參數的值是-1那麼我應該改變這個值。 東西 - 什麼都不做

我有20個參數列表,但我想知道是否有檢查它沒有做任何方式:

如果參數1 == -1然後... ..其他。

如果參數2 == -1,那麼....否則......

任何人有任何想法,我能做些什麼,使之更有效率? 謝謝!

回答

4

如果參數都是變量(它不是在陣列或某事),你可以做一個函數,寫

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

而且你只有一個,如果(功能)和大量話費。 最好將它存儲在某個結構體(數組,列表等)中,並避免調用該函數20次。

+1

難道你要麼需要一個指針傳遞給函數的參數或者返回的潛在更新後的值?即'change_or_let_it_be(&param1,value)'或'param1 = change_or_let_it_be(param1,value);' – simonc

+0

這只是一個提示,當然它需要真正改變。 –

+0

任何包含工作代碼的答案都會更清晰。你可以更新它使用我建議的選項之一嗎? – simonc

3

不知道我是否理解你想要什麼,但怎麼樣?

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

檢查了每一個值,所以你不需要硬編碼所有不同的值,然後改變參數時,它的-1。另外請注意,我認爲「高效」意味着更高的代碼寫入時間!

0

說實話,如果不是最漂亮的解決方案,if/then語句系列是最有效的!在一個循環中嵌入測試和存儲的參數作爲數組需要以下額外的計算:

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

當然,如果你要執行這些測試,20人多次考慮這些速度問題僅僅是一個因素。但實際上你已經儘可能有效寫它儘可能:)

0

另一種更簡潔的方案:

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