C中没有其他三元运算符
我想在C中没有使用三元运算符。我该怎么做。
(a)? b: nothing;
这样的事情。 我什么都不用?
如果您使用的是这样的三元运算符,可能会被替换为:
if (a) { b; }
哪个更好,更好。 (意图更清晰,因此代码更容易阅读,并且不会有性能损失。)
但是,如果您使用三元运算符作为表达式,即
printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : ); a = b*c + (d == 0 ? 1 : );
那么
值取决于它所使用的上下文。在我的第一个例子中,
应该是""
,而在第二个例子中它应该是0
。
省略的false表达式无效。 请尝试反转条件。
(!a) ?: b;
if-else
是一个控制流构造wheras?:是一个运算符, x ? y : z
x ? y : z
是一个表达式 – 表达式不能具有“无值”,而控制流可以具有“不执行任何路径”。 if-else和?之间没有真正的等价: – 它们在所有情况下都不可互换。
在某些情况下,你可以达到你想要的效果,但是if
没有else
情况,使用if
可能效率较低。 例如:效果:
if( x ) { y = z ; }
可通过以下方式实现:
y = x ? z : y ;
但是当x为false时,有一个有效但多余的else y = y
赋值,你的编译器可能会或可能不会优化。 因此,只有当您知道要返回的“当前值”作为?:
表达式结果时,才能实现该效果。
你不能省略else
部分。 只需使用无表达式。
但是,在这种情况下,通常最好使用if
…
似乎这个问题已经存在了一段时间,但FWIW是一个用GCC 4.6.3编译的简短C程序,揭示了以下内容:
- 以下不编译:
a = a ? b:;
a = a ? b:;
。 “错误:”之前的预期表达 令牌”。 - 以下是等效的:
a = a ?: b;
和a = a ? a : b;
a = a ? a : b;
也许有人可以添加更多的编译器端细节,但对我来说,省略true
执行路径似乎只是花哨。
我尝试将任何整数放在那里,效果很好。 例如,如果您想要返回“a”,如果它被评估为true,那么您可以将其写为:
true ? a : 1;
我这样做了
isLeapYear(i) ? cout<< i<
但不确定,如果有任何性能损失。
试试这个
BOOL bIsOK = (a == 5)?TRUE:FALSE;