2015-10-11 72 views
0

在编写复杂逻辑检查时,我无法理解C++中的运算符分组。 基本上,我只是担心,如果这个代码:三元运算符:异常抛出和嵌套

int getIndex(int i) throw(Exception) { 
    return (i >= 0 && i < length) ? array[i] : throw IndexOutOfBoundsException(); 
} 

是相同的,因为这一个:

int getIndex(int i) throw(Exception) { 
    return i >= 0 && i < length ? array[i] : throw IndexOutOfBoundsException(); 
} 

此外,我不确定是什么限制,而嵌套三元运营商,因为我想做这样的事情:

int getIndex(int i) throw(Exception) { 
    return (i >= 0 && i < capacity) ? ((i < length) ? (array[i]) : (throw IndexOfEmptyFieldException();) : (throw IndexOutOfBoundsException();)) 
} 

但(当然)我希望它能正常工作,也是可读的。

如果你认为这是使用三元运算符的坏榜样,我应该只使用if/else或一些其他的方法,避免结构像这样的未来?

+2

使用三元表达式有两个问题,第一个也是最明显的是可读性/可维护性方面。第二个是表达式的两个分支必须返回相同的类型,而不是。事实上,你的一个分支根本不会返回。 –

+0

@JoachimPileborg它编译,虽然我没有尝试运行它。此外,此异常的catch块会终止程序。 –

+0

嵌套三元组如何增加可读性?如果存在多个条件,我肯定会更喜欢if/else – user463035818

回答

2

? :优先级低于&&,所以是的,你的前两个例子是等价的。

至于你的第三个例子,我会写,随着

int getIndex(int i) throw(Exception) { 
    return 
     i < 0 || i >= capacity ? throw IndexOutOfBoundsException() : 
     i >= length   ? throw IndexOfEmptyFieldException() : 
     array[i] 
    ; 
} 

我认为“嵌套”有条件的运营商都很好,只要他们是“系列化”,即它们形成,如果数额是多少,一个/ elsif/else链。

虽然这种特殊情况是有争议的,因为只有一个分支实际返回一个值。另外两个只是抛出一个异常,而且通常作为一个单独的语句更好:抛出异常没有真正的价值作为表达式;它仅用于其副作用。