44

I want to use ternary operator without else in C. How do I do it.

(a)? b: nothing;

something like this. What do I use in nothing part?

4

9 回答 9

50

如果您正在使用这样的三元运算符,大概可以将其替换为:

if (a) { b; }

要好得多。(意图更清晰,所以代码更容易阅读,不会有性能损失。)

但是,如果您使用三元运算符作为表达式,即

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);

a = b*c + (d == 0 ? 1 : <nothing>);

那么这个<nothing>值取决于它被使用的上下文。在我的第一个例子中,<nothing>应该是"",在第二个例子中应该是0

于 2012-09-04T09:48:38.233 回答
27

省略的假表达式无效。尝试扭转这种情况。

(!a) ?: b;
于 2013-09-14T10:33:42.223 回答
13

if-else是一个控制流构造,而?:它是一个运算符,并且x ? y : z是一个表达式 - 一个表达式不能有“无值”,而控制流可以有一个“什么都不做的路径”。if-else 和 ?: 之间没有真正的等价关系 - 它们并非在所有情况下都可以互换。

在某些情况下你可以达到你想要的效果,但它的效率可能不如不if使用else. 比如效果:

if( x )
{
    y = z ;
}

可以通过以下方式实现:

y = x ? z : y ;

但是else y = y当 x 为 false 时,有一个有效但冗余的分配,您的编译器可能会或可能不会优化。所以你可以达到效果,但前提是你知道“当前值”作为?:表达式结果返回。

于 2012-09-04T12:38:16.957 回答
3

You can't omit the else part. Just use a none expression.

But, in that case, it is often better to use an if...

于 2012-09-04T09:44:23.577 回答
3

我尝试将任何整数放在那里,效果很好。例如,如果你想返回“a”,如果它被评估为真,那么你可以这样写:

true ? a : 1;
于 2017-06-07T16:37:22.773 回答
2

似乎这个问题已经存在了一段时间,但 FWIW 一个用 GCC 4.6.3 编译的简短 C 程序揭示了以下内容:

  1. 以下不编译:a = a ? b:;. “错误:';'之前的预期表达式 令牌”。
  2. 以下是等效的:a = a ?: b;a = a ? a : b;

也许有人可以添加更多编译器方面的细节,但对我来说,省略执行路径似乎true只是很花哨。

于 2014-03-14T01:47:25.247 回答
0

三元表达式基于从布尔条件派生的语句。如果按照您的预期标记了一个语句,void()那么什么也不会发生。

C++ 代码:

condition ? add(value) : void();

C代码:

condition ? add(value) : 0;
于 2021-04-01T15:41:33.943 回答
0

我做了这个

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

但不确定,如果这对性能有任何影响。

于 2017-05-06T16:27:23.923 回答
-9

尝试这个

BOOL bIsOK = (a == 5)?TRUE:FALSE;
于 2012-09-04T11:12:05.137 回答