2016-03-13 1 views
1

Я писал рекурсивную функцию и столкнулся с проблемой в операторе 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 [я] или 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; 
} 

как я фиксированной это путем инициализации переменной с результатом выражения и последующего добавления т hat к возвращаемому значению.

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; 
} 

Может ли кто-нибудь объяснить, что происходит? Можно ли избежать объявления переменной, чтобы получить правильный результат?

+0

Это очень запутанно. Напишите простую функцию «main», которая вызывает «SumOfEvenNumbers» с образцами, которые показывают проблему, а затем объясните, какой результат вы ожидаете, и что вы получили. –

+3

[MCVE] пожалуйста. Нужно только взять еще дюжину строк, чтобы составить полный, компилирующий набор исходных кодов, который фактически продемонстрирует вашу проблему с поведением, которое вы не можете объяснить. – Yakk

ответ

6

Тернарный условный оператор имеет более низкий приоритет, чем оператор +. Ваш код был на самом деле разбирается как

(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

+0

Спасибо всем! Мне это не приходило в голову. – p0licat

0

Может кто-нибудь объяснить, что происходит?

Посмотрите на operator precedence. Здесь тройной условный случай имеет очень низкий приоритет. В выражении SumOfEvenNumbers(v, i+1) + (v[i]%2==0)?v[i]:0 рассчитывается после+ с учетом неожиданного результата.

Можно ли избежать объявления переменной, чтобы получить правильный результат?

I случаи, когда вы не уверены в порядках операторов, безопасно использовать кронштейны (), чтобы указать порядок явно. Таким образом, SumOfEvenNumbers(v, i+1) + ((v[i]%2==0)?v[i]:0) будет рассчитываться как ожидалось.

 Смежные вопросы

  • Нет связанных вопросов^_^