Троичный оператор без другого в C

Я хочу использовать троичный оператор без каких-либо еще в C. Как мне это сделать.

(a)? b: nothing;

что-то вроде этого. Что я использую ни в чём?

11 ответов

Если вы используете такой троичный оператор, предположительно его можно заменить на:

if (a) { b; }

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

Однако, если вы используете троичный оператор в качестве выражения, т.е.

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);

a = b*c + (d == 0 ? 1 : <nothing>);

тогда <nothing> значение зависит от контекста, в котором оно используется. В моем первом примере <nothing> должно быть "", а во втором так и должно быть 0,

Пропущенное ложное выражение недопустимо. Попробуйте поменять условие.

(!a) ?: b;

if-else является контрольной конструкцией потока ?: является оператором, и x ? y : z является выражением - выражение не может иметь "никакого значения", в то время как поток управления может иметь "путь бездействия". Нет реальной эквивалентности между if-else и?: - они не взаимозаменяемы при любых обстоятельствах.

Вы можете добиться желаемого эффекта в некоторых обстоятельствах, но он, вероятно, менее эффективен, чем использование if без else, Например, эффект:

if( x )
{
    y = z ;
}

может быть достигнуто путем:

y = x ? z : y ;

но есть эффективный, но избыточный else y = y присваивание, когда x ложно, что ваш компилятор может или не может оптимизировать. Таким образом, вы можете достичь эффекта, но только если вы знаете "текущее значение", возвращаемое как ?: результат выражения.

Вы не можете опустить else часть. Просто используйте выражение без выражения.

Но в этом случае часто лучше использовать if...

Похоже, этот вопрос уже давно существует, но FWIW, короткая программа на C, скомпилированная с GCC 4.6.3, показала следующее:

  1. Следующее не компилируется: a = a ? b:;, "ошибка: ожидаемое выражение перед ';' лексема".
  2. Следующее эквивалентно: a = a ?: b; а также a = a ? a : b;

Возможно, кто-то может добавить больше деталей на стороне компилятора, но мне кажется, что опуская true путь исполнения просто фантазии.

Я попытался положить любые целые числа там, и это работает хорошо. Например, если вы хотите вернуть "a", если оно оценено как true, вы можете написать его так:

true ? a : 1;

Я сделал это

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

Не уверен, однако, если есть какие-либо показатели производительности с этим.

Тернарные выражения основаны на выводе утверждений из логических условий. Если заявление помечено void()тогда, как вы ожидаете, ничего не происходит.

Код С++:

      condition ? add(value) : void();

C-код:

      condition ? add(value) : 0;

Если бы я знал, что это выражение должно быть истинным, иначе программа находится в недопустимом состоянии, но тернарный оператор подходит лучше, чем обычныйутверждение, я делал так

      condition ? value : throw;

И оставьте его, как указано выше, или добавьте конкретное исключение.

Есть множество других формa ? b : nothing;можно взять.

Оценка короткого замыкания, гдеbбудет оцениваться только в том случае, еслиaправда:

      a && b;

Тройная система, гдеnothingвыражение(void)0:

      a ? b : (void)0;

Перевернутое троичное условие с пустой серединой (может быть непереносимым):

      !a ? : b;

Простоifзаявление:

      if (a) {
    b;
}

Попробуй это

BOOL bIsOK = (a == 5)?TRUE:FALSE;
Другие вопросы по тегам