如果条件是假的,那么“什么都不做”(noop)的三元表达?

问题描述 投票:11回答:10

出于好奇,我开始想知道是否有可能有三元表达式,如果它的计算结果为假,则在假分支中不执行任何操作。

也就是有办法写这样的东西:

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

相反:

if (someBool) {
    variable = i;
}

我尝试使用((void)0)while(false){};作为no-op,但编译器需要一个表达式。

更新:

我意识到问题失去了一些意义,因为我试图让代码更容易。我最初的想法是使用三元数初始化静态变量 - 使用静态变量本身作为条件:

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

这假设未初始化的变量初始化为0,这并不总是正确的(或者永远不会在发布版本中,不太确定)。所以也许这是一个假设的问题。

c++ objective-c c ternary-operator
10个回答
14
投票

short-circuit怎么样?

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

(cond && (variable = 42));

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

0
投票

有一个非常简单的解决方法:null lambda。

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

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

只需在代码顶部定义所需类型的各种null lambda即可。

在F#(和Haskell,我相信)中,你一直使用“()”单元执行此操作。这个符号或多或少是一个null lambda返回void。所以,这将是c ++中的基本函数式编程。


6
投票

这个怎么样:

variable = (someBool) ? i : variable ;

虽然我个人更喜欢原来的if语句


4
投票

编译器不仅期望表达式,而且表达式左侧返回type(无论是variable的类型)。所以,不,你不能这样做。这不是条件执行,而是variable成员任务。

这些是完全不同的东西。在第二个例子中:

if (someBool) {
    variable = i;
}

你不分配任何东西,而只是根据条件执行。所以在你的情况下,你不想做任何事情(不分配任何东西),要走的路是条件执行,所以简单地使用第二种情况。


2
投票

conditional expression的格式是

<expression> ? <expression> : <expression>

换句话说,它必须有一些表达。


2
投票

解决你的编辑问题:在静态范围的C99变量中初始化为0.但是,我从未真正相信这一点,因为自从K&R时代以来我一直在用C编程。

无论如何,只需初始化变量。由于变量是静态的,它只会在程序的整个执行时间内发生一次。


1
投票

你可以这样做:

variable = !someBool ?: i;

因为当if表达式为真时,?:将禁止运算,但如果为假,则指定i。

注意:这只在Obj-C中测试过


0
投票

怎么样

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

0
投票

对于C#说:语法:

condition ? first_expression : second_expression;

它说的是first_expression和second_expression:

first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。


0
投票

如果你要评估一个可以为空的对象类型而不是bool,你总是可以写:

variable = myVar ?? i;

Hacky / cludgey / impractical - 可能全部都是3,但是为了这个问题,这是一种省略'else'的方法。

© www.soinside.com 2019 - 2024. All rights reserved.