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