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)
将按预期计算。
我正在写一个递归函数,在 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)
将按预期计算。