Итак, у меня есть функция, возвращающая целое число вместе с некоторым максимальным и минимальным значением для него. Я хотел сделать это с красивым и чистым однострочником в конце:

(freq>max_freq) ? return max_freq : ((freq<min_freq) ? return min_freq : return freq);

Но то, что я получаю это

posplot.hh:238:21: error: expected primary-expression before ‘return’
     (freq>max_freq) ? return max_freq : ((freq<min_freq) ? return min_freq : return freq);}
                     ^
posplot.hh:238:21: error: expected ‘:’ before ‘return’
posplot.hh:238:21: error: expected primary-expression before ‘return’
posplot.hh:238:21: error: expected ‘;’ before ‘return’

Итак, это потому, что использовать return здесь - глупая вещь, и я должен сделать это как-то иначе, или это может сработать, но я облажался? Мне очень любопытно, потому что, кажется, я использовал '?' оператор как более аккуратный if-else для многих вещей, и он всегда работал нормально. Может кто-нибудь объяснить, почему это происходит?

0
user3142453 3 Фев 2015 в 23:02

3 ответа

Лучший ответ

Вам нужно переместить return до тернарных операторов:

return (freq>max_freq) ? max_freq : ((freq<min_freq) ? min_freq : freq);

Обычно ожидается, что тернарный оператор будет оценивать одно значение в каждой ветви (что означает, что это должно быть 3 выражения , и вы создаете одно выражение и два оператора , поскольку return создает инструкцию).

6
Reed Copsey 3 Фев 2015 в 20:04

? Оператор можно использовать в выражениях. возврат - это заявление

Ваша однострочная строка может выглядеть так:

return (freq>max_freq ? max_freq : (freq<min_freq ? min_freq : freq));
2
morfizm 3 Фев 2015 в 20:05

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

Само условное выражение имеет значение: значение выбранного операнда. Оцените это и верните:

return (freq>max_freq) ? max_freq : ((freq<min_freq) ? min_freq : freq);
3
Mike Seymour 3 Фев 2015 в 21:40