变量在if语句中有不同的值

Variable has different value in `if` statement

本文关键字:if 语句 变量      更新时间:2023-10-16

在我的类中我将i声明为private int i
在我的一个类函数中,我声明i = 0,像这样:

void Expression::tokenize()
{
    i = 0;
    cout<<"i before is:"<< i <<endl;
    strcpy(exp, expression.c_str());
    char *p = strtok(exp, " ");
    while (p != NULL)
    {
        if(strcmp(p, "+"))
        {
            cout<<"i after is:"<< i <<endl;
            ops[i] = *p;
        };
        p = strtok(NULL, " ");
    };
}

"i before"的值为0,而"i after"的值则完全不同。

您显然已经找到了具体的问题(并且可能至少相信您已经解决了它)。

这更多的是从如何避免这类问题开始的。您正在将字符串分割成由一个或多个空格分隔的令牌。在c++中,您可以使用类似这样的代码来更简洁地完成此操作:

std::istringstream buffer(expression);
std::string token;
while (buffer >> token) { 
    if (token == "+")
        ops.push_back(token);

您可以使用标准算法进一步清理:

std::istringstream buffer(expression);
std::copy_if(std::istream_iterator<std::string>(buffer),
             std::istream_ierator<std::string>(),
             std::back_inserter(ops),
             [](std::string const &s) { return s=="+"; });

我在这里对你的意图做了一点猜测。就像现在一样,您的代码将每个+存储到ops[0]中,因为您从未增加i,但我猜这是对发布的疏忽或简化,并且您真的打算将它们存储到连续的位置。同样,我猜您真的想要存储任何操作符,所以您可能真的想要一个像这样的lambda表达式:

[](std::string const &s) { return s.find_first_of("+-*/") != std::string::npos; }