ternary operator without else in C

非 Y 不嫁゛ 提交于 2019-12-05 08:41:44

问题


I want to use ternary operator without else in C. How do I do it.

(a)? b: nothing;

something like this. What do I use in nothing part?


回答1:


If you are using a ternary operator like that, presumably it could be replaced by:

if (a) { b; }

which is much, much better. (The intent is clearer, so the code is easier to read, and there will be no performance loss.)

However, if you are using the ternary operator as an expression, i.e.

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

a = b*c + (d == 0 ? 1 : <nothing>);

then the <nothing> value depends on the context it is being used in. In my first example, <nothing> should be "", and in the second it should be 0.




回答2:


An omitted false expression is invalid. Try reversing the condition instead.

(!a) ?: b;



回答3:


if-else is a control flow construct wheras ?: is an operator, and x ? y : z is an expression - an expression cannot have "no value", while control flow can have a "do nothing path". There is no real equivalence between if-else and ?: - they are not interchangeable in all circumstances.

You can achieve the effect you want in some circumstances, but it is probably less efficient that using if without else. For example the effect of:

if( x )
{
    y = z ;
}

can be achieved by:

y = x ? z : y ;

but there is an effective but redundant else y = y assignment when x is false which your compiler may or may not optimise out. So you can achieve the effect but only if you know the "current value" to return as the ?: expression result.




回答4:


You can't omit the else part. Just use a none expression.

But, in that case, it is often better to use an if...




回答5:


Seems this question has been around for a while, but FWIW a short C program compiled with GCC 4.6.3 revealed the following:

  1. The following does not compile: a = a ? b:;. "error: expected expression before ‘;’ token".
  2. The following is equivalent: a = a ?: b; and a = a ? a : b;

Perhaps someone can add more compiler-side details, but to me it seems that omitting the true execution path is just being fancy.




回答6:


I did this

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

Not sure though, if there is any performance hit with this.




回答7:


I tried putting any integers there and it works well. For example, if you want to return "a" if it's evaluated true, then you can write it like:

true ? a : 1;



回答8:


Try this

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


来源:https://stackoverflow.com/questions/12260777/ternary-operator-without-else-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!