【问题标题】:C++ if statement notation - Is this equivalent?C ++ if 语句表示法 - 这是等效的吗?
【发布时间】:2016-06-10 08:46:00
【问题描述】:

我 99% 确定这不会起作用,但剩下的 1% 让我很困扰

    int x;

    //is this if statement

    if(x == 1, 5, 7)
    {
    //do something here
    }
    //equivalent to this if statement

    if((x == 1) || (x == 5) || (x == 7))
    {
    //do something here
    }

【问题讨论】:

  • 你可以试试看它是否有效。
  • 这是我第一次看到有人用逗号尝试这个。他们通常会尝试类似if (x == 1 || 5 || 7)
  • 如果您想要一个快速整数“X 在集合 Y”操作(其中集合 Y 在编译时已知),请使用 switch 语句,因为它被编译为文字哈希表(一个分支表),速度非常快。
  • @Barmar 为什么要在我能得到快速响应并通过这种方式找到答案时尝试一下,很容易。
  • @ThatGuy “我有一个可能的值列表来检查它很长” 将该列表放入 std::arraystd::vector 并使用 std::find_if() .

标签: c++ if-statement syntax


【解决方案1】:

不,这完全不等同。

if(x == 1, 5, 7)

调用comma operator,由于, 的优先级最低,它实际上会以最后一个值结束:

if(7)

因为用括号展开应该看起来像

if(((x == 1), 5), 7)

同时

if((x == 1) || (x == 2) || (x == 7))

检查x 是否等于127

【讨论】:

【解决方案2】:

他们不相等。当你写它像

if(x == 1, 5, 7)
    {
    //do something here
    }

它基本上翻译成

if(7)
    {
    //do something here
    }

如果条件块中的数字是非零数字,这将始终为真。

示例 1:

int main()
{
    int x=10;
    if(x==1,5,7)
        cout<<"hello"<<endl;
    return 0;
}

这里的输出是“hello”,因为 7 被视为一个真正的布尔变量。

示例 2:

int main()
    {
        int x=10;
        if(x==1,5,0)
            cout<<"hello"<<endl;
        return 0;
    }

这里没有输出,因为 0 被认为是一个错误的布尔变量。

【讨论】:

  • 您可能想要建议表达式计算为 7 的原因,例如逗号运算符。
【解决方案3】:

关于 OP 评论部分中讨论的更快解决方案,这里有一个“快速”解决方案:

如果您有大量的持续比较要执行,switch 语句比单独的 if(x == 1) 语句更快,因为它被编译成一个分支表(一种直接的哈希表在程序代码中,给它O(1) 查找),但是现有的编译器也可能已经将if(x==1||x==2||x==3...) 优化为分支表。

bool xIsInSet = false;
switch( x ) {
    case 0: case 1: case 2: case 3:
    case 4: case 5: case 6: case 7: // add a case for each literal comparison
        xIsInSet = true; // no `break` needed, there's only 1 case.
}
if( xIsInSet ) {
    // do stuff
}

这可以内联到一个 lambda,它会立即被调用以消除 xIsInSet

if( [&x]() -> bool {
    switch(x) { case 0: case 1: case 2: case 3: return true; }
    return false; }()
) {
    // do stuff
}

不幸的是,C++11 的可变参数模板不允许我们动态添加 case 语句,并且使用预处理器 #define 破解它是可能的 - 如果您不介意使用元编程库。更好的选择可能是您的构建脚本生成的文件的内联 #include。更简洁的方法是以某种方式 #include 来自另一个程序的标准输出(例如,如果我们可以做到 #include '.\generateCasesFor.sh 1 2 5 10 12',可惜还没有)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2011-01-27
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多