我认为三元运算符就像GOTO语句一样。它们有其用处,但通常应该避免使用它们以使代码更易于理解。
正如其他人所指出的,它们非常适用于短小简单的条件语句。我特别喜欢将它们用于默认值(类似于JavaScript和Python中的||和or),例如:
int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;
另一个常见的用途是在C++中初始化引用。由于引用必须在声明和初始化语句中同时声明和初始化,因此无法使用if语句。
SomeType& ref = pInput ? *pInput : somethingElse;
我通常在这样的事情中使用它:
before:
if(isheader)
drawtext(x, y, WHITE, string);
else
drawtext(x, y, BLUE, string);
after:
drawtext(x, y, isheader == true ? WHITE : BLUE, string);
用它来:
访问对象(数组)属性:
var status = statuses[error == null ? 'working' : 'stopped'];
返回语句:
function getFullName(){
return this.isMale() ? "先生 " : "女士 " + this.name;
}
初始化变量:
var formMethod = DEBUG_FLAG == true ? "GET" : "POST";
验证参数:
function(object){
var prop1 = typeof object.property == 'undefined'
? "默认属性"
: object.property;
//...
}
代码示例使用JavaScript编写。
对于简单的if情况,我喜欢使用它。实际上,将其作为函数参数或类似内容进行编码/阅读要容易得多。此外,为了避免换行,我喜欢将所有的if/else保持在一起。
在我的书中,嵌套是绝对不可以的。
因此,总结一下,对于单个if/else,我会使用三元运算符。对于其他情况,则使用常规if/else if/else(或switch)。
对于简单的任务,比如根据条件赋予不同的值,它们非常好用。但是如果有更长的表达式依赖于条件,我不会使用它们。
if
构造(像大多数Icon一样)实际上是一个表达式。因此,您可以这样做:x[if y > 5 then 5 else y] := "Y"
我最近看到一种关于三元运算符的变体(或者说是类似的),使得标准的"() ? :"变体似乎成为了清晰易懂的典范:
var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]
var Name = ['Jane', 'John'][Gender == 'm'];
请注意,这是JavaScript,所以其他语言可能不支持这样的事情(谢天谢地)。
x = x if x else y
,但后来询问了别人的意见,得知它实际上可以简化为x = x or y
(http://stackoverflow.com/questions/18199381/self-referencing-ternary/18199562#18199562)。 - Scruffy