【问题标题】:Ternary operator: exception throwing and nesting三元运算符:异常抛出和嵌套
【发布时间】:2016-01-08 22:59:04
【问题描述】:

在编写复杂的逻辑检查时,我无法理解 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 或其他方法,并且以后避免使用这种结构?

【问题讨论】:

  • 您对三元表达式的使用存在两个问题,第一个也是最明显的问题是可读性/可维护性方面。第二个是表达式的两个分支必须返回相同的类型,而你没有。事实上,您的一个分支根本没有返回。
  • @JoachimPileborg 它已编译,虽然我没有尝试运行它。此外,此异常的 catch 块会终止程序。
  • 嵌套三元如何增加可读性?当有多个条件时,我肯定更喜欢 if/else
  • @JoachimPileborg 该标准特别允许将 throw 表达式放在条件(三元)运算符中,在这种情况下,结果具有另一个分支的类型。

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


【解决方案1】:

? : 的优先级低于&amp;&amp;,所以是的,您的前两个示例是等价的。

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

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

我认为“嵌套”条件运算符只要“序列化”就可以了,即它们形成相当于 if/elsif/else 链。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2011-12-18
    相关资源
    最近更新 更多