我想將大於(>)和小於(<)的運算符作爲參數傳遞給函數,它怎麼可能..有什麼辦法可以傳遞這些運算符作爲論據..任何人都可以幫助我。將運算符作爲參數傳遞給函數C
2
A
回答
1
沒有辦法通過'原始'操作符,但有辦法達到相同的結果。 最簡單的將是一個char
int func(char op, int a, int b)
{
if (op == '<')
{
return a < b;
}
else if (op == '>')
{
return a > b;
}
return -l; /* error */
}
一個更復雜的解決方案將是使用函數指針到執行的操作(類似於由排序方法中使用的比較器)的功能。
1
您可以創建一個枚舉並傳遞它。 或者你可以在一個指針傳遞給這樣一個比較函數:
#include <stdio.h>
int max(int a, int b, int (*comp)(int, int)) {
if (comp(a, b) < 0) {
return b;
} else {
return a;
}
}
int mycomp(int a, int b) {
return a < b ? -1 : 1;
}
int main() {
printf("%d %d\n", max(1, 2, mycomp), max(2, 1, mycomp));
}
1
你可以做可怕的事情用宏,但總的來說,不,你不能做到這一點。您通常會接受兩個參數函數並將其調用,並且該函數可酌情使用>
或<
,有關示例,請參閱the sort
docs。這就是說,它不是超高效的(通過一個指針調用一個函數不能被內聯,而對於像>
或<
或<
比較那樣的廉價操作,函數調用的開銷超過了比較工作)。使其高效要求:
- 代碼的多個拷貝,每個可能的操作者(經由宏可能產生)
- 移動到C++,並使用模板代碼與函子/ lambda表達式,可以適當地被內聯
+0
當然,從技術上講,C++模板化代碼實際上是在專門化模板時製作代碼的多個副本。但是,它只是在需要時以更安全的方式這樣做,並且它不會如此糟糕地混淆源代碼,它會稍微膨脹最終的二進制大小。 – ShadowRanger
相關問題
- 1. 行爲遞增運算符作爲參數傳遞給函數
- 2. 將字符串作爲參數傳遞給目標函數c
- 3. 將lodash every()函數作爲參數傳遞給Rx.JS map()運算符
- 4. 將代碼從c#傳遞給c作爲函數參數
- 5. 將數組作爲參數傳遞給函數C
- 6. 如何在LISP中將算術運算符作爲函數參數傳遞?
- 7. 複製字符串傳遞給函數作爲參數在C
- 8. 在C++中將函數參數作爲函數參數傳遞
- 9. 是否有可能將函數作爲參數傳遞給c?
- 10. 將c#函數作爲參數傳遞給Javascript
- 11. 將函數作爲參數傳遞給C++中的方法
- 12. C++ - 將rapidjson :: Document作爲參數傳遞給函數
- 13. 將函數作爲參數傳遞給方法C++
- 14. 如何將Div id作爲參數傳遞給C#函數?
- 15. 將函數作爲參數傳遞給Objective-C方法
- 16. 將函數作爲參數傳遞給C++中的模板?
- 17. Python ctypes,將c_void_p作爲輸出參數傳遞給c函數
- 18. C++將FILE *作爲參數傳遞給函數
- 19. 將函數作爲參數傳遞給C++時出現錯誤
- 20. 將字符串集合作爲參數傳遞給JavaScript函數
- 21. 將字符向量作爲參數傳遞給函數plyr
- 22. 在傳遞給函數的參數上調用new運算符
- 23. 作爲參數傳遞給函數Javascript
- 24. 傳遞函數作爲參數傳遞給另一個函數
- 25. 將函數數組作爲參數傳遞給函數
- 26. 通Java腳本函數作爲參數傳遞給C++函數
- 27. 將一個算術運算符作爲參數傳遞給rails方法?
- 28. 將C#中的參數作爲參數傳遞給C++中的回調函數
- 29. 將參數作爲參數傳遞給函數?
- 30. javascript - 將回調函數作爲參數傳遞給函數
你不能直接。您需要傳入運算符的表示(通常使用枚舉),然後將函數轉換爲正確的運算符。 – kaylum
aaaaand我們有一個完全合理的問題來自新用戶 –
[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)的強制性愚蠢downvote多? – Lundin