C语言中无else的三元算子
我想在C中使用三元运算符而不使用其他运算符。我该怎么做呢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 !
(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
语句即可