很抱歉,这太简单了。我想知道哪个条件发生了。有没有一种方法可以捕获此内容,而无需使用if结构在块内重复它们?我正在使用C语言。
while ( l < 0 || l > 2 || c < 0 || c > 2 )
答案 0 :(得分:6)
您可以使用逗号表达式,即类似(expr1,expr2)
的表达式,它们总是从左到右计算,每个,
处都有一个序列点;因此,您可能会依赖于expr1
在expr2
之前被求值,而后者则是逗号表达式的结果。
这样,以下操作应该起作用,并且x
会在0..3
范围内变化,这取决于满足的条件:
int x;
while ( (x=0,l < 0) || (++x,l > 2) || (++x,c < 0) || (++x,c > 2) )
答案 1 :(得分:1)
您可以“即时”将它们分配给先前声明的变量:
bool ll0, lg2, cl0, cg2;
while((ll0 = l<0) || (lg2 = l>2) || (cl0 = c<0) || (cg2 = c>2)) {
if(ll0) {
// l is less than 0
} else if(lg2) {
// l is greater than 2
} else if(cl0) {
// c is less than 0
} else if(cg2) {
// c is greater than 2
}
// ...
}
请注意if-else链,因为||
运算符会短路(即,如果第一个操作数已经为true
,则第二个操作数甚至不会被评估),例如ll0
是正确的,其他值将无法正确分配。
话虽这么说,老实说,我不会打扰-只需重复条件语句,如果这些只是整数变量,那么这些比较将不会花费您任何钱(实际上,编译器甚至可以将比较值保留在某些情况下,将其回收)。
答案 2 :(得分:1)
您可以使用无条件的循环,在循环中计算条件,并在任何条件为真时中断。
while (1) // or for(;;)
{
bool one = l < 0;
bool two = l > 2;
bool three = c < 0;
bool four = c > 2;
if (one || two || three || four) break;
// bool variables are available there
}
如果要访问所有条件,则不能对其进行短路评估。因此,请确保您确实要预先存储它们。