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

时间:2013-10-08 10:39:54

标签: c++ objective-c c ternary-operator

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

是的,有办法写这样的东西:

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

相反:

if (someBool) {
    variable = i;
}

我尝试((void)0)while(false){};作为无操作,但编译器需要表达式。

更新

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

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

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

10 个答案:

答案 0 :(得分:14)

short-circuit怎么样?

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

(cond && (variable = 42));

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

答案 1 :(得分:6)

这个怎么样:

variable = (someBool) ? i : variable ;

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

答案 2 :(得分:4)

编译器不仅需要表达式,而且表达式左侧返回typevariable的类型是什么)。所以,不,你不能这样做。它不是条件执行,而是variable成员分配。

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

if (someBool) {
    variable = i;
}

你不分配任何东西,而只是根据条件执行。所以在你的情况下,你不希望任何事情(而不是分配任何事情),那么最后的方法是条件执行,所以使用只是第二种情况。

答案 3 :(得分:2)

conditional expression的格式为

<expression> ? <expression> : <expression>

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

你可以这样做:

variable = !someBool ?: i;

因为当if表达式为真时,?:no-op,但如果它为假,则指定i。

注意:这只在Obj-C

中测试过

答案 6 :(得分:0)

怎么样

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

答案 7 :(得分:0)

对于C#说: 语法:

condition ? first_expression : second_expression;

它说的是first_expression和second_expression:

  

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

答案 8 :(得分:0)

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

variable = myVar ?? i;

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

答案 9 :(得分: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,我相信)中,你一直使用&#34;()&#34;单元。这个符号或多或少是一个null lambda返回void。所以,这将是c ++中的基本函数式编程。