我正在写一个递归函数,并在return语句中遇到了问题。
int SumOfEvenNumbers(int v[], int i)
{
if ( i > v[0] )
return 0;
return SumOfEvenNumbers(v, i+1) + (v[i]%2==0)?v[i]:0;
}
该函数的调用如下:
SumOfEvenNumbers(vector_indexed_from_1, 1);
//v[0] is equal to the number of elements, excluding itself
我期望返回的三元组是v [i]还是0(如果它是偶数)但显然在将每个三元组的结果打印到屏幕之后,表达式产生的唯一值是1和0。
int SumOfEvenNumbers(int v[], int i)
{
if ( i > v[0] )
return 0;
cout << (v[i]%2==0)?(v[i]):(0); // either a 1 or a 0
return SumOfEvenNumbers(v, i+1) + (v[i]%2==0)?v[i]:0;
}
我修复此问题的方法是使用表达式的结果初始化变量,然后将其添加到返回值。
int SumOfEvenNumbers(int v[], int i)
{
if ( i > v[0] )
return 0;
int rv = (v[i]%2==0)?(v[i]):(0);
return SumOfEvenNumbers(v, i+1) + rv;
}
有人可以解释发生了什么吗?是否可以避免声明变量以获得正确的结果?
答案 0 :(得分:6)
三元条件运算符的优先级低于operator +。 您的代码实际上被解析为
(SumOfEvenNumbers(v, i+1) + (v[i]%2==0)) ? v[i] : 0;
要获得所需内容,请使用括号
SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)) ? v[i] : 0);
答案 1 :(得分:0)
有人能解释发生了什么吗?
看看operator precedence。这里三元条件恰好具有非常低的优先级。在SumOfEvenNumbers(v, i+1) + (v[i]%2==0)?v[i]:0
表达式中,在 +
之后计算给出意外结果。
是否可以避免声明变量以获得正确的结果?
如果您不确定操作符的顺序,我可以使用括号()
明确指示顺序。因此SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)?v[i]:0)
将按预期计算。