значение по умолчанию для троичного оператора

Мне интересно немного о 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())?

Надеюсь, что-то из этого имеет смысл, это то, что я до сих пор не понимал.

1

Решение

Вы можете использовать функцию max для этого:

float clamped = max(1.f - x + my_function(), .2f);
5

Другие решения

Как насчет

float v;
float processed = (v = expr) > 0.f ? special_val : v;

?

Или более обобщенно

type tmp;
type result = condition(tmp = expr) ? special_val : tmp;
0

По вопросам рекламы [email protected]