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

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

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

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

против:

if (someBool) {
    variable = i;
}

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

обновление:

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

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

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

10 ответов


как о короткое замыкание?

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

(cond && (variable = 42));

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

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

variable = (someBool) ? i : variable ;

хотя я лично предпочел бы оригинал if statement


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

это полностью разные вещи. Второй пример :

if (someBool) {
    variable = i;
}

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


формат условное выражение is

<expression> ? <expression> : <expression>

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


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

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


вы могли бы сделать:

variable = !someBool ?: i;

как о

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

для C# говорит: Синтаксис:

condition ? first_expression : second_expression;

и это говорит о first_expression и second_expression:

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


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

variable = myVar ?? i;

Hacky/cludgey / непрактично - вероятно, все 3, но ради этого вопроса это способ опустить "еще".


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

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

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

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

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