C中没有其他三元运算符

use*_*777 29 c if-statement ternary operator-keyword

我想在C中没有使用三元运算符.我该怎么做.

(a)? b: nothing;
Run Code Online (Sandbox Code Playgroud)

这样的事情.我什么都没用?

huo*_*uon 41

如果您使用这样的三元运算符,可能会被以下内容替换:

if (a) { b; }
Run Code Online (Sandbox Code Playgroud)

这是多,好.(意图更清晰,因此代码更容易阅读,并且不会有性能损失.)

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

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

a = b*c + (d == 0 ? 1 : <nothing>);
Run Code Online (Sandbox Code Playgroud)

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


小智 16

省略的false表达式无效.请尝试反转条件.

(!a) ?: b;
Run Code Online (Sandbox Code Playgroud)

  • 注意,没有第二个操作数的`?:`是GNU扩展.语义可能不提供问题的答案,因为第一个操作数(`!a`)的值将在非假的情况下使用,而第三个操作数的值(`b`)将被使用.因为`!`,如果`a`为假,那么它总是'true`(技术上是非零值),而OP想要"无". (7认同)

Cli*_*ord 10

if-else是一个控制流构造wheras ?:是一个运算符,并且x ? y : z是一个表达式 - 一个表达式不能具有"无值",而控制流可以具有"不做任何路径".if-else和?之间没有真正的等价: - 它们在所有情况下都不可互换.

某些情况下,您可以达到所需的效果,但使用if不使用效果可能效率较低else.例如:效果:

if( x )
{
    y = z ;
}
Run Code Online (Sandbox Code Playgroud)

可通过以下方式实现:

y = x ? z : y ;
Run Code Online (Sandbox Code Playgroud)

但是else y = y当x为false时,有一个有效但冗余的赋值,你的编译器可能会或可能不会优化.因此,只有当您知道要返回的"当前值"作为?:表达式结果时,才能实现此效果.


md5*_*md5 4

您不能省略该else部分。只需使用 none 表达式即可。

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

  • @user437777,if 和三元很可能被编译为相同的代码。 (3认同)