Ответ 1
как насчет short-circuit?
int variable = 0;
bool cond = true; // or false
(cond && (variable = 42));
printf("%d\n", variable);
Из любопытства я начал задаваться вопросом, возможно ли иметь тернарное выражение, которое, если оно оценивает значение 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, что не всегда верно (или никогда не происходит в релизах, не совсем уверен). Так что, возможно, это гипотетический вопрос.
как насчет short-circuit?
int variable = 0;
bool cond = true; // or false
(cond && (variable = 42));
printf("%d\n", variable);
Как насчет этого:
variable = (someBool) ? i : variable ;
Хотя я лично предпочел бы исходный оператор if
Компиляторы не только ожидают выражения, но и выражение возвращает type
с левой стороны (тип variable
что бы это ни было). Итак, нет, вы не можете этого сделать. Это не условное выполнение, а variable
назначение членов.
Это совершенно разные вещи. Во втором примере:
if (someBool) {
variable = i;
}
вы ничего не назначаете, а просто выполняете на основе условия. Таким образом, в вашем случае, когда вы не хотите ничего делать (не присваивайте что-либо), способ перехода - это условное выполнение, поэтому используйте просто второй случай.
Формат условного выражения
<expression> ? <expression> : <expression>
Другими словами, он должен иметь некоторое выражение.
Адресация вашего редактирования: в C99 переменные статической области инициализируются на 0. Однако я никогда не доверял этому, потому что я программировал на C со времен K & R.
Во всяком случае, просто инициализируйте переменную. Поскольку переменная является статической, она будет происходить только один раз в течение всего времени выполнения программы.
Вы можете сделать:
variable = !someBool ?: i;
Поскольку символ:: no-op, если выражение if истинно, но назначить i, если оно ложно.
Примечание. Это было проверено только в Obj-C
Как насчет
(someBool) ? (variable = i) : NULL;
В С# говорится: Синтаксис:
condition ? first_expression : second_expression;
И он говорит о first_expression и second_expression:
Любой тип выражения first_expression и second_expression должен быть одинаковым, или неявное преобразование должно существовать от одного типа к другому.
Если вы хотите оценить тип объекта с возможностью NULL вместо bool
, вы всегда можете написать:
variable = myVar ?? i;
Hacky/cludgey/unractical - возможно, все 3, но ради этого вопроса это способ пропустить "else".
Существует очень простое исправление: 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, я считаю), вы делаете это все время с помощью блока(). Этот символ более или менее представляет собой нулевую лямбда-возвращающую пустоту. Таким образом, это будет базовое функциональное программирование внутри С++.