14

出于好奇,我开始想知道是否有可能有一个三元表达式,如果它的计算结果为假,则在假分支中什么都不做。

即有没有办法写这样的东西:

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

相对于:

if (someBool) {
    variable = i;
}

我试过((void)0)or while(false){};as no-op 但编译器需要一个表达式。

更新:

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

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

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

4

10 回答 10

16

短路怎么办?

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

(cond && (variable = 42));

printf("%d\n", variable);
于 2013-10-08T10:45:22.733 回答
6

这个怎么样:

variable = (someBool) ? i : variable ;

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

于 2013-10-08T10:41:52.850 回答
4

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

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

if (someBool) {
    variable = i;
}

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

于 2013-10-08T10:41:25.947 回答
2

条件表达式的格式为

<expression> ? <expression> : <expression>

换句话说,它必须有某种表达。

于 2013-10-08T10:43:01.883 回答
2

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

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

于 2013-10-08T11:02:07.220 回答
1

你可以这样做:

variable = !someBool ?: i;

因为 ?: 当 if 表达式为真时将无操作,但如果它为假则分配 i 。

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

于 2014-05-29T15:39:48.027 回答
0

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

variable = myVar ?? i;

哈克/笨拙/不切实际 - 可能全部 3,但为了这个问题,这是一种省略“其他”的方式。

于 2013-10-08T10:50:56.933 回答
0

怎么样

(someBool) ? (variable = i) : NULL;
于 2013-10-08T10:43:25.120 回答
0

对于 C# 说: 语法:

condition ? first_expression : second_expression;

它说的是 first_expression 和 second_expression:

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

于 2013-10-08T10:43:29.983 回答
0

尝试:空 lambda。

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

a > c ? b = c.push_back(b) : null_lambda();
于 2018-02-12T16:13:05.867 回答