Троичный оператор без другого в 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, показала следующее:
- Следующее не компилируется:
a = a ? b:;
, "ошибка: ожидаемое выражение перед ';' лексема". - Следующее эквивалентно:
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;
}