2

以下是有问题的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断言。

+0

你认为这有什么特别的原因,可能被禁止? – user2357112

+0

当然可以。尽管技术上这个*是一个条件表达式。但合法≠好。写出逻辑:'if(foo())bar();'。你写的不是惯用的C++。 –

+0

@ user2357112当然,如果第二个子句没有返回一个值,它就是非法的。因此,短路操作员似乎需要返回一个值。如果没有任何东西可以返回,会发生什么? –

回答

2

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

1所述的& &操作员组左到右。操作数都是 上下文转换为布尔(第4章)。如果 两个操作数均为真,则结果为true,否则为false。与&,& &保证 从左到右评估:如果 第一个操作数是假,则不评估第二个操作数。

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

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

在这种情况下,表达式的结果被丢弃,同样,如果你这样做:

1; 
6

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

有什么不对你的写作getWeekday(index, Weekday) && getName(Weekday, Name);

你的代码的读者会知道,如果getWeekday(index, Weekday)计算结果为falsegetName(Weekday, Name)不会被调用。

+0

谢谢,“condone”可能是错误的词。我只是想知道是否允许。 –