C++如何用单行语句调用函数更新最大值且避免重复调用?
问题
需要多次调用一个返回整数的函数,每次检查返回值是否大于之前记录的最大值,想用单行语句避免代码重复。目前用临时变量存返回值再用三元运算符更新最大值,但代码冗余;直接在三元运算符里调用函数会导致函数被调用两次,不想这样,有没有办法实现不重复调用函数的单行语句?
现有代码
int callFunction() { int result = // do something; return result; } int main() { int result = 0; int tmpResult = 0; // call 1 int tmpResult = callFunction(); result = (tmpResult > result) ? tmpResult : result; // call 2 int tmpResult = callFunction(); result = (tmpResult > result) ? tmpResult : result; // call 3 int tmpResult = callFunction(); result = (tmpResult > result) ? tmpResult : result; // log the highest result }
尝试的代码(存在重复调用问题)
result = (callFunction() > result) ? callFunction() : result;
解决方案
针对C语言场景,有几种实用的单行写法可以避免函数重复调用:
- 逗号表达式写法
利用逗号表达式从左到右执行的特性,先把函数返回值存入临时变量,再进行判断:
result = (tmpResult = callFunction(), tmpResult > result) ? tmpResult : result;
这里tmpResult = callFunction()会先执行,将函数返回值暂存,之后的判断和赋值都用这个临时变量,函数只会被调用一次,同时实现了单行更新最大值的需求。
- 封装成宏(适合多次复用)
如果需要频繁执行这个逻辑,可以把临时变量的操作封装成宏,调用时就是单行:
#define UPDATE_MAX(max_val, func) do { int tmp = func; if (tmp > max_val) max_val = tmp; } while(0)
使用时直接写:
UPDATE_MAX(result, callFunction());
这种写法把冗余逻辑藏在宏里,既保证调用简洁,又完全避免函数重复执行。
如果是C环境(C17及以上),还可以用lambda表达式配合std::max实现:
result = std::max(result, [tmp = callFunction()](){ return tmp; }());
内容的提问来源于stack exchange,提问作者Jelle
相关产品推荐
相关产品推荐

