C ++ if语句表示法 - 这是等价的吗?

时间:2016-02-26 23:20:02

标签: c++ if-statement syntax

我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
    }

3 个答案:

答案 0 :(得分:5)

不,它完全不相同。

if(x == 1, 5, 7)

调用comma operator,由于,具有最低优先级,因此有效地结束最后一个值:

if(7)

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

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

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

检查x是否等于127

答案 1 :(得分:1)

他们并不平等。当你把它写成

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被认为是假布尔变量。

答案 2 :(得分:0)

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

如果要执行大量常量比较,则switch语句比单个if(x == 1)语句更快,因为它被编译为分支表(a直接在程序代码中使用哈希表,给它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',唉还没有。)