【发布时间】:2016-04-26 15:16:34
【问题描述】:
以下是有问题的minimal, complete, verifiable example。 这不是关于如何改进此代码的问题。 我想知道的是标准是否允许在条件之外使用短路运算符,如 main 中所展示的那样。 p>
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,无需断言。
【问题讨论】:
-
您认为这可能被禁止的任何特殊原因?
-
@JonathanMee “写得不会让人感到困惑”。成语是一种特定的说话/写作方式,它由多个部分组成。在编程中,它专门指以给定语言进行编程的典型方式,该方式将产生不仅专家可以理解的代码,而且清晰简洁地表达意图而没有(a)混淆和(b)难以诊断错误。您的特定代码段在 C++ 中具有不同的表达方式,这无疑是更惯用的。结果,读者会想知道您为什么偏离了方向。
-
@KonradRudolph,但他们是主观的。就自然语言习语而言。它们不会在翻译中延续,甚至在一个小的地理区域之外也有意义。但回到 C++。我的意思是一个检查条件的函数是这样写的:
if(cond) return true; else return false;实际上是不习惯的。 -
@KonradRudolph 根据我过去的经验,我非常同意使用
if-statement。我对您可以“使用证据来量化”这一点的说法提出异议。它编译成相同的代码,但我们使用过去的编码经验阅读和编写代码告诉我们if-statement 是常规的。一旦我说“过去的编码经验”,它就变成了一种主观而非客观的论点,只能用轶事证据“量化”,从相反的观点来看,它已经成熟了,可以产生相互冲突的轶事证据。成语很好,但它们是主观的。 -
@JonathanMee 很抱歉再次挖掘这个问题,但“CommitStrip”刚刚发布了一幅漫画,完美地说明了编写惯用的unsurprising代码的重要性:commitstrip.com/en/2016/01/26/genius-or-stupid? — 这是一部卡通片,因此可能看起来有些夸张,但我向您保证,事实并非如此:这种情况一直发生。
标签: c++ conditional logical-operators control-flow short-circuiting