C 三值if的使用

C 三值if的使用,c,if-statement,ternary-operator,C,If Statement,Ternary Operator,在维基百科中,以下代码部分是等效的: if (a > b) { result = x; } else { result = y; } 以及: 显然,三元if的使用更为简洁,尽管没有那么清楚 我想知道的是:使用三元if而不是传统的if语句是否不好(在代码可读性、执行时间等方面)。我只能想到一种情况,三元运算符无可否认地提高了可读性甚至性能(请参阅本答案的底部)。但一般来说,使用三元代码不会提高代码的可读性/可维护性。如果你偶尔使用它,并且只用于简单的作业,那么它就可以了。不

在维基百科中,以下代码部分是等效的:

if (a > b) {
    result = x;
} else {
    result = y;
}
以及:

显然,三元if的使用更为简洁,尽管没有那么清楚


我想知道的是:使用三元if而不是传统的if语句是否不好(在代码可读性、执行时间等方面)。我只能想到一种情况,三元运算符无可否认地提高了可读性甚至性能(请参阅本答案的底部)。但一般来说,使用三元代码不会提高代码的可读性/可维护性。如果你偶尔使用它,并且只用于简单的作业,那么它就可以了。不好,只是我可以接受。当然,其他人在这一点上可以随意与我格格不入

Ternaries是表达式,因此它们只能作为表达式使用(例如,赋值的一部分)。如果您开始使用ternaries作为语句,那么您就有麻烦了。三元组不是语句,使用它们就像使用勺子作为螺丝刀一样。傻

但总的来说:这是一个品味的问题,只要你不过度。一旦开始嵌套三元组,将它们与指向指针的指针或语句一起使用,这就是一个疯狂的问题。
但老实说:当有疑问时:不要使用三元运算符。它为您节省了一行代码,但不会提高性能。以你为例:

if (a > b) result = x;
else result = y;
//vs:
result = a > b ? x : y;
如果
result
是函数的返回值,您甚至可以编写:

if (a > b) return x;
return y;
尽管我现在有2条返回语句,但我仍然觉得这段代码比以下代码更容易阅读:

result = a > b ? x : y;
//or
return a > b ? x : y;
三元是最佳选择的一个用例是:

const int two_options = some_arg ? 23 : 1;

这使您能够根据条件在函数范围内定义并初始化
常量
,而无需额外函数调用(
const int two_opts=arg_func(some_arg);
,其中函数包含
if else

这一切取决于上下文。如果这是一个微小的、琐碎的比较,那么就不是了。通常,可能是的。在那个例子中,三元数的使用更简洁、更清晰。相比之下,请参见嵌套三元数、用作右值的三元数和副作用的三元数操作数。因为purrrformmanncceeeeeee对我来说,这个三元数与
If…else
一样清晰。这是非常个人的看法。在某个地方也有类似的问题,“我是否应该为技能较低的人编写更容易理解的代码。”对我来说,如果代码看起来不错,那就好了。如果您使用100多个字符长的三元组只是为了避免
If..else
,那么它看起来就开始愚蠢了。+1,但有点勉强。例如,在简单作业的情况下,它相当“好”而不是“好”。“好的”听起来好像你想说“如果你绝对想要,那就去做。”这太弱了,伊姆霍。但我同意这是个人品味的问题。@glglglgl:我说的不好,因为,正如有人评论的那样:调试ternaries比调试传统的
(如果其他
)更“困难”,特别是当涉及指针时(
*some_ptr2ptr->foo=*arg?*arg->foo:0;
->查找空指针),在这种情况下,您没有“简单”的选项赋值不再有效,可读性受到严重影响,所以我同意在这种情况下不使用它。@glglgl:Nips。。。说得对。忘了应用我刚才提倡的规则:-D+1用于const案例。
const int two_options = some_arg ? 23 : 1;