仅用于简单表达式:
int a = (b > 10) ? c : d;
不要链式或嵌套三元运算符,因为这样很难阅读且容易引起混淆:
int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;
此外,在使用三元运算符时,考虑以提高可读性的方式格式化代码:
Moreover, when using ternary operator, consider formatting the code in a way that improves readability:
int a = (b > 10) ? some_value
: another_value;
int a = 0;
if(b > 10) a = some_value;
else a = another_value;
- marcospereiraval x = if(true) 0 else 1
是完全合法的。 - om-nom-nom由于您无法在每个子表达式上设置断点,因此调试略微困难。 我很少使用它。
我喜欢它们,尤其是在类型安全的编程语言中。
我不明白这样做有什么意义:
int count = (condition) ? 1 : 0;
还有比这更难的吗:
int count;
if (condition)
{
count = 1;
}
else
{
count = 0;
}
我认为三元运算符比起其他方式可以使一切更简单、更整洁。
const int count = ...;
。 - deft_codeif/else
的用法。 - boboboboif/else
是大多数程序员重写三元运算符的方式。 - Andre Figueiredo嵌套的链式语句我并不喜欢,但是简单的链式语句我还是可以接受的。
我在C语言中更倾向于使用它们,因为它们是有价值的if语句,这样可以减少不必要的重复或变量:
x = (y < 100) ? "dog" :
(y < 150) ? "cat" :
(y < 300) ? "bar" : "baz";
与其
if (y < 100) { x = "dog"; }
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; }
else { x = "baz"; }
在像这样的任务中,我发现重构更少,更清晰。另一方面,在使用Ruby时,我更有可能使用 if...else...end,因为它也是一个表达式。
在这种任务中,我发现重构较少,代码更加清晰。
然而,在使用Ruby时,我更倾向于使用if...else...end
,因为它也可以作为一个表达式。
x = if (y < 100) then "dog"
elif (y < 150) then "cat"
elif (y < 300) then "bar"
else "baz"
end
(尽管可以承认,对于如此简单的东西,我可能仍然会使用三元运算符。)
?:
运算符只是过程式if
语句的一种函数等价物。因此,只要你不使用嵌套的?:
表达式,关于任何操作的函数表示的赞成和反对的论点都适用于这里。但是,嵌套三元操作可能会导致代码非常令人困惑(读者可以自行尝试编写处理嵌套三元条件的解析器,您将会感受到其复杂性)。
但是,在许多情况下,保守地使用?:
运算符可以使代码比其他方式更容易阅读,例如:int compareTo(Object object) {
if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
return 1;
if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
return -1;
else
return 0;
}
现在将其与此进行比较:
int compareTo(Object object) {
if(isLessThan(object))
return reverseOrder ? 1 : -1;
else(isGreaterThan(object))
return reverseOrder ? -1 : 1;
else
return 0;
}
代码更加紧凑,语法噪音更少,并且通过明智地使用三元运算符(即仅与reverseOrder属性相关)最终结果并不特别简洁。
这实际上是一个风格问题,我通常遵循的潜意识规则有:
foo = (bar > baz) ? true : false
,而不是foo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
<%= (foo) ? "Yes" : "No" %>
(foo) ? FooIsTrue(foo) : FooIsALie(foo)
)我喜欢它,因为对于简单的赋值操作而言,它既简洁又优雅。
foo = (bar > baz);
更简单。 - Ericreturn bar <= baz ? false ! lotto ? false : someArray.Contains(someValue )
- daotoad像很多观点问题一样,答案不可避免地是:“这取决于情况”。
对于类似以下的情况:
return x ? "Yes" : "No";
我认为这比下面的方式 简洁得多(并且对我来说更快解析):
if (x) {
return "Yes";
} else {
return "No";
}
如果你的条件表达式很复杂,那么三元运算符不是一个好选择。例如:
x && y && z >= 10 && s.Length == 0 || !foo
不适合使用三目运算符。
另外,如果你是C程序员,GCC实际上有一个扩展允许你排除三目运算符中的if-true部分,像这样:
/* 'y' is a char * */
const char *x = y ? : "Not set";
假设y
不为NULL
,这将把x
设置为y
。非常棒。
我会尽可能地在代码中使用三元运算符,除非这使代码变得极难阅读,但这通常只是我的代码需要一点重构的迹象。
有些人认为三元运算符是一个“隐藏”的功能或者有些神秘。我很惊讶,因为当我开始接触C编程时,它就是我学习的第一件事情之一。我认为它并不会降低可读性,它是语言的自然部分。
按照 圈复杂度 的衡量标准来看,使用 if
语句或三目运算符是等效的。因此从这个角度来看,答案是否定的,复杂度与之前完全相同。
但从可读性、可维护性和 DRY(不要重复自己) 等其他方面来看,二者的选择都可能比另一个更好。
x = x if x else y
,但后来询问了别人的意见,得知它实际上可以简化为x = x or y
(http://stackoverflow.com/questions/18199381/self-referencing-ternary/18199562#18199562)。 - Scruffy