You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中将字符串逻辑表达式转换为条件表达式并求值?

在C++中求值字符串形式的逻辑表达式的方法

C++标准库并没有直接提供解析并求值字符串形式逻辑表达式的功能,你需要自己实现解析逻辑,或者借助第三方脚本引擎来完成。下面是两种可行的方案:

1. 手动实现简易逻辑表达式解析器

针对你给出的仅包含0、1、()、&&、||的表达式场景,可以手动实现一个解析器,核心思路是先处理括号内的子表达式,再按运算符优先级(&&高于||)逐步计算。

以下是一个示例实现:

#include <iostream>
#include <string>
#include <stack>
#include <cctype>

// 计算无括号的逻辑表达式
bool evaluateSimpleExpr(const std::string& expr) {
    std::stack<bool> values;
    std::stack<char> ops;

    for (size_t i = 0; i < expr.size(); ++i) {
        char c = expr[i];
        if (c == ' ') continue;

        if (isdigit(c)) {
            values.push(c == '1');
        } else if (c == '&' || c == '|') {
            // 处理运算符优先级:&& 比 || 高,先算前面的&&
            while (!ops.empty() && ((ops.top() == '&' && c == '|') || ops.top() == c)) {
                bool b = values.top(); values.pop();
                bool a = values.top(); values.pop();
                char op = ops.top(); ops.pop();
                bool res = (op == '&') ? (a && b) : (a || b);
                values.push(res);
            }
            ops.push(c);
            ++i; // 跳过第二个&或|
        }
    }

    // 处理剩余运算符
    while (!ops.empty()) {
        bool b = values.top(); values.pop();
        bool a = values.top(); values.pop();
        char op = ops.top(); ops.pop();
        bool res = (op == '&') ? (a && b) : (a || b);
        values.push(res);
    }

    return values.top();
}

// 处理带括号的表达式,递归解析括号内的内容
bool evaluateExpr(std::string expr) {
    size_t start = expr.find('(');
    while (start != std::string::npos) {
        size_t end = start;
        int count = 1;
        // 找到匹配的右括号
        while (end + 1 < expr.size() && count != 0) {
            ++end;
            if (expr[end] == '(') ++count;
            else if (expr[end] == ')') --count;
        }
        // 递归计算括号内的表达式
        std::string subExpr = expr.substr(start + 1, end - start - 1);
        bool subRes = evaluateExpr(subExpr);
        // 替换括号内容为计算结果(1或0)
        expr.replace(start, end - start + 1, subRes ? "1" : "0");
        start = expr.find('(');
    }
    return evaluateSimpleExpr(expr);
}

int main() {
    std::string exp = "(1||0)&&(1&&1)&&(1||0&&0)";
    bool result = evaluateExpr(exp);
    std::cout << (result ? "true" : "false") << std::endl; // 输出true
    return 0;
}

这个实现会先递归处理所有括号内的子表达式,将其替换为1或0,然后对剩余的无括号表达式按运算符优先级计算最终结果。

2. 借助嵌入式脚本引擎

如果你的表达式场景更复杂(比如支持变量、更多运算符),可以考虑嵌入像Lua这样的轻量脚本引擎:将字符串形式的逻辑表达式传给脚本引擎执行,再获取返回结果。这种方式无需自己实现复杂的解析逻辑,但需要引入脚本引擎的依赖。

需要注意的是,若表达式来自不可信来源,使用脚本引擎存在安全风险,需做严格的输入校验。

内容的提问来源于stack exchange,提问作者Arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:50:29