c++ - return 语句中的三元运算符

标签 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

我期望三元 if 返回的是 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;
}

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

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

关于c++ - return 语句中的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970684/

相关文章:

c# - 如何从 BeginInvoke 返回 T 值?

java - java中的返回值语法

C++保存成员函数setf()的返回值

c++ - 关于代码版本中的 vtable 和查找的问题

C++/OpenFST - 查找库和链接时出错

c++ - 可以从 istream_iterator 制作 move_iterator 吗?

C++ 无法将 lambda 转换为 std::pair 中的 std::packaged_task

c++ - Visual Studio 2013,错误 MSB8020 : The build tools for Visual Studio 2010 cannot be found

linux - SIGSEGV,段错误。仅在 linux 上,它适用于 windows

c - 检查 printf 的返回值重要吗?