Вернуть выражения в C ++ - PullRequest
       48

Вернуть выражения в C ++

0 голосов
/ 15 марта 2012

Рассмотрим следующий код:

float validateEntry()
{
    string entry;
    float value;

    getline(cin, entry);
    value = atof(entry.data());

    return ((isNumber(entry) && value >= 0) ? i
    : (cout << "Enter valid amount: ", validateEntry())
}

Почему разрешена последняя строка (выражение, разделенное запятыми), и есть ли другие выражения, которые можно использовать с операторами возврата в C ++?

Меня больше всего смущает использование запятой, и мне интересно, где определяется этот синтаксис выражения (я понятия не имел, что он существует, и я не знал, где его найти). Могу ли я заполнить это последнее выражение неопределенным количеством кода; если да, то каковы ограничения, требования и т. д.? 1006

Ответы [ 4 ]

1 голос
/ 20 мая 2012
return [expression];

expression :
   expression , expression
   literal
   etc...

Оператор запятой разделяет несколько выражений в одной строке.При использовании в операторе присваивания, таком как оператор возврата (назначение временного значения, которое возвращается), присваивается только самое правое значение.Предыдущие выражения выполняются слева направо.В вашем примере возвращено значение последнего вызова функции.

Я использую эту технику для очистки формальных переменных аргумента при сбое.Особенно процедуры COM, где есть сбой.Например:

HRESULT func(..., IInterface **ppv)
{
...
If(!good)
  return (*ppv = 0), E_FAIL;
...
}
1 голос
/ 15 марта 2012

Оператор запятой позволяет вам сгруппировать два не связанных между собой выражения.Оба выражения всегда вычисляются, и результат является результатом второго выражения.Почти всегда плохая идея использовать его (потому что это ухудшает читабельность, только чтобы сохранить строку кода), за исключением, может быть, в верхней части цикла for.

0 голосов
/ 15 марта 2012

? : является единственным троичным оператором C ++

его синтаксис logical-or-expression ? expression : conditional-expression

Подробнее об этом можно прочитать на MSDN

0 голосов
/ 15 марта 2012

, - это оператор, аналогичный + или <<, так что вы можете свободно использовать его почти везде, где ожидается выражение.Исключением являются контексты, в которых ожидается запятая с другим значением, например, при вызове функции.В таком контексте вам необходимо устранить неоднозначность запятой, добавив дополнительный набор символов:

foo((b,c)); // call foo with a single argument

Показанное вами утверждение эквивалентно:

// return ((isNumber(entry) && value >= 0) ? i : (cout << "Enter valid amount: ", validateEntry())

if(isNumber(entry) && value >= 0) {
    return i;
} else {
    cout << "Enter valid amount: ";
    return validateEntry();
}

Это просто «умный»способ условного выполнения cout << "Enter valid amount: " перед вызовом validateEntry() при использовании как можно меньшего количества строк.Конечно, вся функция - это просто «умный» способ многократно запрашивать ввод, пока он не получит действительный ввод.ИМО цикл был бы лучше, чем рекурсия здесь.

...