C中没有其他三元运算符

时间:2012-09-04 09:43:25

标签: c operator-keyword if-statement ternary

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

(a)? b: nothing;
像这样的事情。我什么都不用?

9 个答案:

答案 0 :(得分:40)

如果您使用的是这样的三元运算符,可能会被替换为:

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 }。

答案 1 :(得分:15)

省略的虚假表达无效。请尝试改变条件。

(!a) ?: b;

答案 2 :(得分:10)

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

您可以在某些环境中实现所需的效果,但使用if而不使用else可能效率较低。例如:

的效果
if( x )
{
    y = z ;
}

可以通过以下方式实现:

y = x ? z : y ;

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

答案 3 :(得分:3)

您不能省略else部分。只需使用无表达式。

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

答案 4 :(得分:2)

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

  1. 以下内容无法编译:{{1​​}}。 “错误:在';'令牌之前预期表达。”
  2. 以下内容相当于:a = a ? b:;a = a ?: b;
  3. 也许有人可以添加更多的编译器端细节,但对我来说,省略a = a ? a : b;执行路径似乎只是花哨。

答案 5 :(得分:0)

我做了这个

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

不确定,如果有任何表现受到影响。

答案 6 :(得分:0)

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

true ? a : 1;

答案 7 :(得分:0)

三元表达式基于从布尔条件导出语句。如果一条语句被标记为 void(),那么正如您所料,什么都不会发生。

C++ 代码:

condition ? add(value) : void();

C 代码:

condition ? add(value) : 0;

答案 8 :(得分:-7)

试试这个

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