返回语句中的三元运算符

时间:2016-03-13 13:14:37

标签: c++ c++11 return expression ternary-operator

我正在写一个递归函数,并在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;
}

有人可以解释发生了什么吗?是否可以避免声明变量以获得正确的结果?

2 个答案:

答案 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);

请参阅:angular http Documetation i follwed

答案 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)将按预期计算。