C 中没有 else 的三元运算符

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

我想在C中使用三元运算符而不使用else。我该怎么做。

(a)? b: nothing;

类似这样的事情。我在什么都没有的部分用什么?

c operator-keyword if-statement ternary
11个回答
56
投票

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

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


29
投票
省略的假表达式无效。尝试相反的情况。

(!a) ?: b;
    

14
投票

if-else

 是控制流构造,而 
?:
 是运算符,
x ? y : z
 是表达式 - 表达式不能具有“无值”,而控制流可以具有“不执行任何操作的路径”。 if-else 和 ?: 之间没有真正的等价物 - 它们在所有情况下都不能互换。

在某些

情况下你可以达到你想要的效果,但可能比不使用if而使用

else
效率低。例如效果:

if( x ) { y = z ; }

可以通过以下方式实现:

y = x ? z : y ;

但是当 x 为 false 时,有一个有效但冗余的 
else y = y

赋值,您的编译器可能会也可能不会优化它。因此,您可以实现效果,但前提是您知道要作为

?:
表达式结果返回的“当前值”。
    


4
投票
else

部分。只需使用 none 表达式即可。


但是,在这种情况下,通常最好使用

if

...

    


3
投票

以下内容无法编译:
    a = a ? b:;
  1. 。 “错误:‘;’标记之前的预期表达式”。
    以下是等效的:
  2. a = a ?: b;
  3. a = a ? a : b;
    
    
    
  4. 也许有人可以添加更多编译器端细节,但对我来说,省略
true

执行路径只是一种幻想。

    


3
投票

true ? a : 1;



2
投票

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


但不确定这是否会对性能造成影响。


1
投票
void()

那么正如你所期望的,什么也不会发生。

C++代码:

condition ? add(value) : void();

C代码:

condition ? add(value) : 0;



1
投票
if()

语句更适合,我曾经这样做过

condition ? value : throw;

并保留上面的内容或添加特定的例外情况。


0
投票
a ? b : nothing;

可以采取。

短路评估,其中 

b

仅当

a
为 true 时才会评估:
a && b;

三元,其中 
nothing

表达式为

(void)0
:
a ? b : (void)0;

具有空白中间的反向三元条件(可能不可移植):

!a ? : b;

一个简单的
if

声明:

if (a) {
    b;
}



-10
投票

BOOL bIsOK = (a == 5)?TRUE:FALSE;

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