以下是有问题的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 :(得分: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;