Какое условие верно в то время как? - PullRequest
0 голосов
/ 12 ноября 2018

Извините, если это слишком просто. Я хочу знать, какое из условий происходит точно. Есть ли способ лучше захватить это, не повторяя их внутри блока со структурами if? Я использую язык C.

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

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать цикл без условий, вычислять условия в цикле и прерывать, если выполняется любое из условий.

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
}

Если вы хотите получить доступ ко всем условиям, вы не можете использовать для них оценку короткого замыкания. Поэтому убедитесь, что вы действительно хотите сохранить их заранее.

0 голосов
/ 12 ноября 2018

Вы можете использовать выражения с запятыми, то есть что-то вроде (expr1,expr2), которые всегда оцениваются слева направо с точкой последовательности в каждом ,; Таким образом, вы можете полагаться на то, что expr1 вычисляется до expr2, тогда как последнее служит результатом выражения запятой.

При этом должно работать следующее, и x будет находиться в диапазоне 0..3, в зависимости от того, какое условие выполнено:

int x;
while ( (x=0,l < 0) || (++x,l > 2) || (++x,c < 0) || (++x,c > 2) )
0 голосов
/ 12 ноября 2018

Вы можете назначить их «на лету» ранее объявленным переменным:

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, так как оператор || замыкает накоротко (т.е. второй операнд isnдаже не оценивается, если первое уже true), если, например, ll0 истинно, другие значения не будут назначены правильно.

При этом, честно говоря, я бы не сталнадоело - просто повторите условные, если это просто целочисленные переменные, то эти сравнения не будут вам стоить ничего (на самом деле, компилятор может даже сохранить значение сравнения в некоторых случаях и перезапустить его).

...