在While中哪个条件正确?

时间:2018-11-11 23:16:36

标签: c c99

很抱歉,这太简单了。我想知道哪个条件发生了。有没有一种方法可以捕获此内容,而无需使用if结构在块内重复它们?我正在使用C语言。

while ( l < 0 || l > 2 || c < 0 || c > 2 )

3 个答案:

答案 0 :(得分:6)

您可以使用逗号表达式,即类似(expr1,expr2)的表达式,它们总是从左到右计算,每个,处都有一个序列点;因此,您可能会依赖于expr1expr2之前被求值,而后者则是逗号表达式的结果。

这样,以下操作应该起作用,并且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
}

如果要访问所有条件,则不能对其进行短路评估。因此,请确保您确实要预先存储它们。