我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
}
答案 0 :(得分:5)
不,它完全不相同。
if(x == 1, 5, 7)
调用comma operator,由于,
具有最低优先级,因此有效地结束最后一个值:
if(7)
因为用括号展开应该看起来像
if(((x == 1), 5), 7)
而
if((x == 1) || (x == 2) || (x == 7))
检查x
是否等于1
,2
或7
。
答案 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'
,唉还没有。)