返回语句中的三元运算符

p0l*_*cat 2 c++ expression return ternary-operator c++11

我正在编写一个递归函数,并在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;
}
Run Code Online (Sandbox Code Playgroud)

该函数调用如下:

SumOfEvenNumbers(vector_indexed_from_1, 1);
//v[0] is equal to the number of elements, excluding itself
Run Code Online (Sandbox Code Playgroud)

我期望返回的三元组是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;
}
Run Code Online (Sandbox Code Playgroud)

我修复它的方法是使用表达式的结果初始化变量,然后将其添加到返回值.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

(SumOfEvenNumbers(v, i+1) + (v[i]%2==0)) ? v[i] : 0;
Run Code Online (Sandbox Code Playgroud)

要获得所需内容,请使用括号

SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)) ? v[i] : 0);
Run Code Online (Sandbox Code Playgroud)

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