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