三元运算符:异常抛出和嵌套

时间:2015-10-11 11:49:11

标签: c++ ternary-operator operator-precedence throw

在编写复杂的逻辑检查时,我无法理解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或其他方法并避免将来像这样的构造吗?

1 个答案:

答案 0 :(得分:2)

struct item* loop(struct item *root) { if(root != NULL){ if(root->right != NULL) { loop(root->right); printf("%s\n", root->basket); exit(0); // It would respond to Exit and stop the looping of tree return root; } if(root->left != NULL) { loop(root->left); printf("%s\n", root->basket); return root; // This would be ignored exit(0); // This doesn't help too } } } 的优先级低于? :,所以是的,您的前两个示例是等效的。

至于你的第三个例子,我把它写成

&&

我认为&#34;嵌套&#34;条件运算符只要序列化&#34;就可以了,即它们形成if / elsif / else链。

但这个特殊情况值得商榷,因为只有一个分支实际返回一个值。另外两个只是抛出一个异常,并且通常作为一个单独的语句更好:抛出异常作为表达没有实际价值;它仅用于其副作用。