假设我想在if语句中测试不仅仅是一个,而是几个等价变量:
if(x1==x2==y1==y2){
printf("Input values shouldn't be equal!");
}
但这似乎不起作用。还有什么方法可以做到这一点?
答案 0 :(得分:26)
if (x1 == x2 && x2 == y1 && y1 == y2) { ... }
表达式a == b
的结果将是0或1的整数值。==
运算符是左关联的,因此表达式a == b == c
将被计算为{{ 1}};也就是说,(a == b) == c
(0或1)的结果将与c的值进行比较。所以在下面的代码中
a == b
如果a == b且c == 1或a!= b且c == 0,则表达式仅计算为true。
答案 1 :(得分:10)
if (x1 == x2 && x1 == y1 && x1 == y2)
{
printf("Input values shouldn't be equal!");
}
答案 2 :(得分:9)
if( x1 == x2 && x2 == y1 && y1 == y2 ) { ... }
答案 3 :(得分:6)
如果它们是整数,则可以使用按位运算:
if ((x1 & x2 & x3 & x4) == (x1 | x2 | x3 | x4))
// all are equal
它将评估为真正的IFF它们都是相同的
答案 4 :(得分:3)
这是一种不同的方法,使用辅助变量(count_equals
),以便您可以轻松完成(并理解)。
int count_equals = 0;
if (x1 == x2) count_equals++;
if (x1 == y1) count_equals++;
if (x1 == y2) count_equals++;
if (x2 == y1) count_equals++;
if (x2 == y2) count_equals++;
if (y1 == y2) count_equals++;
if (count_equals == 0) /* all values are different */;
else if (count_equals == 6) /* all values are equal */;
else /* some values are equal */;
答案 5 :(得分:1)
此处提供的解决方案大多正确且易于理解。
但我更喜欢solution provided by Sany Huttunen:
引用:
if (x1 == x2 && x1 == y1 && x1 == y2)
{
printf("Input values shouldn't be equal!");
}
以下是:
的原因虽然在这个具体案例中似乎不可能,但它立即指导我考虑重构,如:
(a*b) + (a*c) + (a*d)
可以简化为
a*(b+c+d)
如上所述,在这个具体案例中不可能简化,因为
(a*b) + (a*c) + (a*d)
遵循不同的数学规则
(a+b) * (a+c) * (a+d)
如果我没记错的话,这与交换,联想和分配规则有关。
答案 6 :(得分:0)
不起作用,因为(x1 == x2)的计算结果为数字1,如果为真,则假设为0,则为0。 (x1 == x2 == x3)最终评估为((x1 == x2)== x3)。
我认为你需要编写自己的函数才能做到这一点。
答案 7 :(得分:0)
以下C代码应该回答您的问题:
if(x1==x2 && x1 == y1 && x1 == y2 &&
x2==y1 && x2 == y2 &&
y1 == y2)
{ printf("Input values shouldn't be equal!"); }
return 0;
}
答案 8 :(得分:0)
这是另一种使用布尔逻辑的方法
bool all_equal(false)
all_equal = x1 == x2;
all_equal = all_equal && (x2 == x3);
all_equal = all_equal && (x3 == x4);
一个好的编译器可以使用条件汇编指令对此进行编码,而不会中断指令预取队列。
答案 9 :(得分:-1)
您的问题是==运算符的使用不正确。你需要使用类似的东西:
if ((x1 == x2) && (x1 == y1) && (x1 == y2)) {
printf("Input values shouldn't be equal!");
}