在条件外使用短路运算符是否合法?

时间:2016-01-20 16:47:18

标签: c++ conditional logical-operators control-flow short-circuiting

以下是有问题的minimal, complete, verifiable example这不是关于如何改进此代码的问题。我想知道的是标准是否容许在条件之外使用短路运算符,如main中所示。

enum weekday {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    WEEKDAY_SIZE
};

bool getWeekday(int index, weekday& result) {
    result = static_cast<weekday>(index);

    return index >= 0 && index < static_cast<int>(WEEKDAY_SIZE);
}

bool getName(weekday& index, string& result) {
    switch (static_cast<weekday>(index)) {
    case SUNDAY:
        result = "Sunday";
        break;
    case MONDAY:
        result = "Monday";
        break;
    case TUESDAY:
        result = "Tuesday";
        break;
    case WEDNESDAY:
        result = "Wednesday";
        break;
    case THURSDAY:
        result = "Thursday";
        break;
    case FRIDAY:
        result = "Friday";
        break;
    case SATURDAY:
        result = "Saturday";
        break;
    default:
        assert("Short Circut Failed");
        return false;
    }
    return true;
}

int main() {
    const int index = 0;
    weekday Weekday;
    string Name;

    getWeekday(index, Weekday) && getName(Weekday, Name);

    cout << Name << endl;
}

这适用于Visual Studio 2015和gcc 5.1而无需断言。

2 个答案:

答案 0 :(得分:5)

宽恕编码风格不是标准的工作。

你的写作getWeekday(index, Weekday) && getName(Weekday, Name);

没有错

您的代码的读者会知道,如果getName(Weekday, Name)评估为getWeekday(index, Weekday),则不会调用false

答案 1 :(得分:2)

From the C++14 standard,第5.14节:

  

1&amp;&amp;操作员组从左到右。操作数都是   在上下文中转换为bool(第4条)。如果,结果是真的   两个操作数都是真的,否则是假的。不像&amp; ,&amp;&amp;担保   从左到右的评估:如果是,则不评估第二个操作数   第一个操作数是假的

     

2结果是一个布尔。如果是第二个   表达式被评估,每个值计算和副作用   与第一个表达式相关联的序列在每个值之前排序   与第二个表达式相关的计算和副作用。

该标准没有说明使用&&的背景。如果左侧评估为假,则不评估右侧。

在此上下文中,表达式的结果将被丢弃,类似于执行此操作:

1;