三元运算符:异常抛出和嵌套
Ternary operator: exception throwing and nesting
在编写复杂的逻辑检查时,我无法理解 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
或其他一些方法并避免在未来?
? :
的优先级低于 &&
,所以是的,你的前两个例子是等价的。
至于你的第三个例子,我会写成
int getIndex(int i) throw(Exception) {
return
i < 0 || i >= capacity ? throw IndexOutOfBoundsException() :
i >= length ? throw IndexOfEmptyFieldException() :
array[i]
;
}
我认为 "nested" 条件运算符只要它们是 "serialized" 就可以,即它们构成了一个 if/elsif/else 链。
虽然这个特殊情况值得商榷,因为实际上只有一个分支 returns 一个值。其他两个只是抛出一个异常,作为单独的语句通常更好:抛出异常作为表达式没有实际价值;它仅用于其副作用。
在编写复杂的逻辑检查时,我无法理解 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
或其他一些方法并避免在未来?
? :
的优先级低于 &&
,所以是的,你的前两个例子是等价的。
至于你的第三个例子,我会写成
int getIndex(int i) throw(Exception) {
return
i < 0 || i >= capacity ? throw IndexOutOfBoundsException() :
i >= length ? throw IndexOfEmptyFieldException() :
array[i]
;
}
我认为 "nested" 条件运算符只要它们是 "serialized" 就可以,即它们构成了一个 if/elsif/else 链。
虽然这个特殊情况值得商榷,因为实际上只有一个分支 returns 一个值。其他两个只是抛出一个异常,作为单独的语句通常更好:抛出异常作为表达式没有实际价值;它仅用于其副作用。