簡體   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