Тернарное выражение, которое "ничего не делает" (noop), если условие ложно?

Из любопытства я начал задаваться вопросом, возможно ли иметь тернарное выражение, которое, если оно оценивает значение false, ничего не делает в ложной ветки.

Т.е. есть способ написать что-то вроде этого:

variable = (someBool) ? i : <do nothing>;

В отличие от:

if (someBool) {
    variable = i;
}

Я пробовал ((void)0) или while(false){}; как no-op, но компилятор ожидает выражения.

UPDATE:

Я понял, что вопрос потерял какой-то смысл, потому что я попытался сделать код проще. Первоначальная идея, которую я имел, состояла в том, чтобы инициализировать статическую переменную var с помощью trernary - используя статический var как условие:

static int var = (var != 0) ? var = 1 : (var already initialized, do nothing);

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

Ответ 1

как насчет short-circuit?

int variable = 0;
bool cond = true; // or false

(cond && (variable = 42));

printf("%d\n", variable);

Ответ 2

Как насчет этого:

variable = (someBool) ? i : variable ;

Хотя я лично предпочел бы исходный оператор if

Ответ 3

Компиляторы не только ожидают выражения, но и выражение возвращает type с левой стороны (тип variable что бы это ни было). Итак, нет, вы не можете этого сделать. Это не условное выполнение, а variable назначение членов.

Это совершенно разные вещи. Во втором примере:

if (someBool) {
    variable = i;
}

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

Ответ 4

Формат условного выражения

<expression> ? <expression> : <expression>

Другими словами, он должен иметь некоторое выражение.

Ответ 5

Адресация вашего редактирования: в C99 переменные статической области инициализируются на 0. Однако я никогда не доверял этому, потому что я программировал на C со времен K & R.

Во всяком случае, просто инициализируйте переменную. Поскольку переменная является статической, она будет происходить только один раз в течение всего времени выполнения программы.

Ответ 6

Вы можете сделать:

variable = !someBool ?: i;

Поскольку символ:: no-op, если выражение if истинно, но назначить i, если оно ложно.

Примечание. Это было проверено только в Obj-C

Ответ 7

Как насчет

(someBool) ? (variable = i) : NULL;

Ответ 8

В С# говорится: Синтаксис:

condition ? first_expression : second_expression;

И он говорит о first_expression и second_expression:

Любой тип выражения first_expression и second_expression должен быть одинаковым, или неявное преобразование должно существовать от одного типа к другому.

Ответ 9

Если вы хотите оценить тип объекта с возможностью NULL вместо bool, вы всегда можете написать:

variable = myVar ?? i;

Hacky/cludgey/unractical - возможно, все 3, но ради этого вопроса это способ пропустить "else".

Ответ 10

Существует очень простое исправление: null lambda.

auto null_lambda = [](){return;};
int a = 1;
int b = 2;
vector<int> c;

a > c ? b = c.push_back(b) : null_lambda();

Просто определите различные нулевые lambdas типов, которые вы хотите в верхней части кода.

В F # (и Haskell, я считаю), вы делаете это все время с помощью блока(). Этот символ более или менее представляет собой нулевую лямбда-возвращающую пустоту. Таким образом, это будет базовое функциональное программирование внутри С++.