繁体   English   中英

返回语句中的三元运算符

[英]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

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

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

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

(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

谁能解释一下发生了什么?

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

是否可以避免声明变量以获得正确的结果?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM