C语言中无else的三元算子

C语言中无else的三元算子,c,operator-keyword,if-statement,ternary,C,Operator Keyword,If Statement,Ternary,我想在C中使用三元运算符而不使用其他运算符。我该怎么做呢 (a)? b: nothing; 像这样的。“无”部分使用什么?您不能省略其他部分。只需使用一个none表达式 但是,在这种情况下,最好使用if..如果您使用这样的三元运算符,那么它可能会被替换为: if (a) { b; } 这要好多了。(目的更明确,因此代码更易于阅读,不会出现性能损失。) 但是,如果使用三元运算符作为表达式,即 printf("%d cat%s", number_of_cats, number_of_cats !

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

(a)? b: nothing;

像这样的。“无”部分使用什么?

您不能省略
其他部分。只需使用一个none表达式


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

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

if (a) { b; }
这要好多了。(目的更明确,因此代码更易于阅读,不会出现性能损失。)

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

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

a = b*c + (d == 0 ? 1 : <nothing>);
printf(“%d猫%s”,猫的数量,猫的数量!=1?:;
a=b*c+(d==0?1:);
然后,
值取决于所使用的上下文。在我的第一个示例中,
应该是
,而在第二个示例中,它应该是
0

试试这个

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

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

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

if( x )
{
    y = z ;
}
可通过以下方式实现:

y = x ? z : y ;

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

省略的假表达式无效。尝试相反的条件

(!a) ?: b;

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

  • 以下内容未编译:
    a=a?b:。错误:应在“;”标记之前使用表达式
  • 以下是等效的:
    a=a?:b
    a=a?a:b
  • 也许有人可以添加更多编译器方面的细节,但对我来说,省略
    true
    执行路径只是一种幻想


    isLeapYear(一)?我试着把任何整数放在那里,效果很好。例如,如果要在计算结果为true时返回“a”,则可以这样编写:

    true ? a : 1;
    

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

    C++代码:

    condition ? add(value) : void();
    
    C代码:

    condition ? add(value) : 0;
    

    如果不打算使用其他运算符,为什么要使用三元运算符。它失去了它的目的。我得到了与op相同的问题,
    cout它的意思是什么,您想在什么上下文中使用它?@user5887651可以使用
    (是否定的?(coutHI感谢您的回复。它现在符合要求。我理解了0,但不理解什么(无效)向编译器指示?这要求
    b
    也必须是
    void
    类型。我认为三元运算符比if条件快?我错了吗?@user437777,if和三元可能被编译为同一代码。基准测试?这取决于情况和优化级别。说真的,这根本不相关与这个问题相反……即使它是相关的,它也只相当于
    BOOL blsOK=(a==5);
    注意
    ?:
    没有第二个操作数是GNU扩展。语义可能无法回答这个问题,因为第一个操作数(
    !a
    )的值如果非false,则使用第三个操作数(
    b
    )的值,否则将使用。由于
    ,如果
    a
    为false,而OP希望“无”,则该值始终为
    true
    (技术上为非零值)假设我需要根据条件调用其他宏,而最后一部分什么也不做,我可以写如下内容吗(假设A、B、C在别处定义):#定义setValue(inp)(inp==A)?macro1():(inp==B)?macro2():(inp==C)?macro3():0.但如果0是其他宏的有效返回值,我们可能会遇到问题。@JonWheelock:只需使用多行宏和
    if
    语句即可