return 语句中的三元运算符

Ternary operator inside a return statement

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

我期望的三元 if 到 return 是 v[i] 或 0(如果它是偶数)但显然在将每个三元 if 的结果打印到屏幕后,唯一的值是表达式的结果是 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;
}

我解决这个问题的方法是用表达式的结果初始化一个变量,然后将其添加到 return 值。

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;
}

谁能解释一下发生了什么?是否可以避免声明变量以获得正确的结果?

三元条件运算符的优先级低于运算符+。 您的代码实际上被解析为

(SumOfEvenNumbers(v, i+1) + (v[i]%2==0)) ? v[i] : 0;

要得到你想要的,使用括号

SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)) ? v[i] : 0);

参见:http://en.cppreference.com/w/c/language/operator_precedence

Could anyone explain what is happening?

看看operator precedence。这里的三元条件恰好具有非常低的优先级。在 SumOfEvenNumbers(v, i+1) + (v[i]%2==0)?v[i]:0 表达式中,计算 after + 给你意外的结果。

Is it possible to avoid declaring a variable in order to obtain the correct result?

I 情况下,当您不确定运算符的顺序时,可以安全地使用方括号 () 明确指示顺序。所以 SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)?v[i]:0) 将按预期计算。