【问题标题】:Is it Legal to Use Short Circuit Operators Outside a Conditional?在条件之外使用短路运算符是否合法?
【发布时间】: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


【解决方案1】:

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

你写的没什么问题getWeekday(index, Weekday) &amp;&amp; getName(Weekday, Name);

阅读您的代码的人会知道,如果 getWeekday(index, Weekday) 的计算结果为 false,则不会调用 getName(Weekday, Name)

【讨论】:

  • 谢谢,“宽恕”可能是错误的词。我只是想知道是否允许。
  • “你的代码的读者会知道”——根据我的经验,这是一个假设,大多数程序员都在前 10 个百分位。
  • @mattnz 这让我有些沮丧;也许你是对的。对我来说幸运的是,我能够招聘到前 1% 的人。
【解决方案2】:

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

1 && 运算符从左到右分组。操作数都是 上下文转换为 bool(第 4 条)。结果为真,如果 两个操作数都为真,否则为假。不像 & , && 保证 从左到右求值:如果第二个操作数不求值 第一个操作数为假

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

该标准没有说明使用&amp;&amp; 的上下文。如果左侧评估为 false,则不评估右侧。

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

1;

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2013-06-24
    • 2016-10-27
    • 2010-09-13
    • 2014-05-31
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多