Мне интересно немного о ternary operator
в основном в C++
но я думаю, что это может относиться и к другим языкам.
Лучший пример проблемы, с которой я столкнулся (или я должен назвать ее проблемой? Ну, я думаю, концептуальная проблема), был бы значения зажима.
float clamped = (x<0.3) : 0.3 ? x;
Я хочу написать этот кусок кода, однако x
может быть сложно сказать, что у нас есть что-то вроде этого:
float clamped = (1.f - x + my_function()) > .2f ? .2f : (1.f - x + my_function());
Вот где это, по моему мнению, вышло из-под контроля, и я бы переписал это:
float clamped = (1.f - x + my_function());
if (clamped > .2f)
clamped = .2f;
Так что это приводит к двум вопросам на самом деле
1: есть ли поведение по умолчанию, чтобы я мог сказать «сделай это, если правда, иначе просто делай то, что он сказал», в псевдокоде что-то вроде: float clamped = (1.f - x + my_function()) > .2f : .2f ? **default**;
2: Если я все еще сделаю это первым способом, он сначала оценит условие, и если это false
, сделайте еще одну оценку, чтобы получить значение от (1.f - x + my_function())
?
Надеюсь, что-то из этого имеет смысл, это то, что я до сих пор не понимал.
Вы можете использовать функцию max для этого:
float clamped = max(1.f - x + my_function(), .2f);
Как насчет
float v;
float processed = (v = expr) > 0.f ? special_val : v;
?
Или более обобщенно
type tmp;
type result = condition(tmp = expr) ? special_val : tmp;