Троичное выражение, которое "ничего не делает" (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.
в любом случае, просто инициализировать переменную. Поскольку переменная статична, это произойдет только один раз в течение всего времени выполнения программы.
для 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++.