C++ c++;参考参数未更新
我试图编写一个简单的函数来从字符串中的表达式中提取下一个数字,但我的问题是,在函数退出后,引用参数ioIsValidExpression没有被更新。看起来我实际上引用了正确的变量(而不是临时变量),因为test3(在调用getNextNumber(…)之前调用)和ioIsValidExpression(在函数内部时其名称)的地址是相同的 我希望这在某个地方会是一个令人尴尬的错误,但我想弄明白这一点是行不通的;我在注释行中包含了int main和int getNextNumber,在注释行中我从函数返回一个值C++ c++;参考参数未更新,c++,C++,我试图编写一个简单的函数来从字符串中的表达式中提取下一个数字,但我的问题是,在函数退出后,引用参数ioIsValidExpression没有被更新。看起来我实际上引用了正确的变量(而不是临时变量),因为test3(在调用getNextNumber(…)之前调用)和ioIsValidExpression(在函数内部时其名称)的地址是相同的 我希望这在某个地方会是一个令人尴尬的错误,但我想弄明白这一点是行不通的;我在注释行中包含了int main和int getNextNumber,在注释行中我从函
int getNextNumber(std::string& iExpression, int& ioLoopShift, bool& ioIsValidExpression)
{
//spaces are ignored, a minus is a unary minus (so must be seated next to a number (no spaces between '-' and number))
int length = iExpression.size(); //evaluate only once
bool unaryMinusFound = false;
bool numberFound = false;
int oSubExpression = 0;
for(int i =0; i < length; i++)
{
if((int)iExpression[i] == 32)
{
if(!numberFound)
{
if(!unaryMinusFound)
{
continue;
}
else
{
ioIsValidExpression = false;
td::cout << "address of ioIsValidExpression: " << &ioIsValidExpression << ", value: " << ioIsValidExpression << "\n";
return 0;
}
}
else
{
return unaryMinusFound? -1 * oSubExpression: oSubExpression;
}
}
if((int)iExpression[i] == 45 && !unaryMinusFound)
{
unaryMinusFound = true;
continue;
}
if((int)iExpression[i] >= 48 && (int)iExpression[i] <= 57)
{
numberFound = true;
oSubExpression = (int)(iExpression[i]-48) + 10*oSubExpression;
ioLoopShift++;
continue;
}
else
{
//garbage characters
ioIsValidExpression = false;
return 0;
}
}
return unaryMinusFound? -1 * oSubExpression: oSubExpression;
}
函数参数(输出语句是一系列函数)的求值顺序未指定。考虑如何在输出整个函数之前将函数的结果保存在变量中:
int-temp=getNextNumber(测试、测试2、测试3);
std::是否未指定输出的求值顺序。在函数将其更改为false
之前,您的bool
将被评估为true
。此外,更喜欢<代码> '0' <代码> 48,因为它不总是48。考虑流操作器的情况,使用<代码> STD::CUT…在操作符>
调用序列中的其他元素之前,不能在std::cout
上对操纵器求值。。。这将完全破坏输出。@Jason,它仍然按顺序输出,但参数可以按它喜欢的任何顺序进行计算。它使用一个运算符的结果。cdecl调用约定不创建某种类型的排序吗?对于重载的运算符>>
,有两个参数。这两个参数的求值顺序没有顺序点,但这确实意味着第一个参数是初始求值的,在求值之前修改test3
,或者test3
是首先求值的,然后,包含最外层函数调用的第一个参数的嵌套函数调用不会反映在该计算中。我想这可能是唯一一个模棱两可的订单。谢谢你,现在有人向我指出这一点是有道理的……这一次让我发疯了,我不想再犯错误了!它只定义堆栈上参数的顺序。编译器仍然可以自由地按任意顺序计算它们的值,只要它按该顺序推送它们。另外,该标准没有以这种方式处理调用约定的问题。
int main(int argc, char* argv[])
{
std::string test = " - 45 & ";
int test2 = 0;
bool test3 = true;
std::cout << getNextNumber(test,test2,test3) << ", address of test3: " << &test3 << ", value: " << test3 << "\n";
return 0;
}
address of ioIsValidExpression: 0xbf86e58f, value: 0
0, address of test3: 0xbf86e58f, value: 1
int temp = getNextNumber(test, test2, test3);
std::cout << temp << ", address of test3: " << &test3 << ", value: " << test3 << "\n";