Как определить, какое условие было истинным? - PullRequest
0 голосов
/ 07 октября 2019

Скажем, у меня есть несколько условий внутри оператора if:

if(x < 0 || x > 10 || x == 5)
{

}

Если x больше 10 или меньше 0 или равно 5, я хочу, чтобы программа перестала работать.

if(x < 0 || x > 10 || x == 5)
{
    stop(); // PSEUDO CODE
}

Однако , я хочу, чтобы программа говорила что-то в зависимости от того, какое условие было выполнено. Примерно так:

if(x < 0 || x > 10 || x == 5)
{
    if(x < 0)
    {
        printf("your number was less than 0");
    }

    if(x > 10)
    {
        printf("your number was greater than 10");
    }

    if(x == 5)
    {
        printf("wow, your number is equal to 5!");
    }

    stop(); // PSEUDO CODE
}

Это ужасный способ сделать это, потому что он дважды проверяет условия дважды;как я могу сделать то же самое более эффективным способом?

Ответы [ 4 ]

3 голосов
/ 07 октября 2019

Зачем все усложнять? Просто удалите внешний чек и поместите stop() внутри обоих внутренних:

if(x < 0)
{
    printf("your number was less than 0");
    stop();
}

if(x > 10)
{
    printf("your number was greater than 10");
    stop();
}

Вы можете даже использовать else if, если хотите.

2 голосов
/ 07 октября 2019

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

bool isXNegative = x < 0;
bool isXMoreThan = x > 10;
bool isXFive = (x == 5);

//for specific conditions
if(isXNegative)
{
    printf("your number was less than 0");
}

if(isXMoreThan)
{
    printf("your number was greater than 10");
}

if(isXFive)
{
    printf("wow, your number is equal to 5!");
}

//for combination of the conditions.
if(isXNegative || isXMoreThan || isXFive)
{
    //common code here for all the conditions.
    stop(); // PSEUDO CODE
}
//else if(another condition combination here...){...}
//else {...}
1 голос
/ 07 октября 2019

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

int do_stop = 0;
if(x < 0)
{
    printf("your number was less than 0");
    do_stop = 1;
}

if(x > 10)
{
    printf("your number was greater than 10");
    do_stop = 1;
}

if(x == 5)
{
    printf("wow, your number is equal to 5!");
    do_stop = 1;
}

if (do_stop) {
    stop();
}
0 голосов
/ 07 октября 2019

Если вы хотите усложнить задачу, сохранить некоторые нажатия клавиш и воспользоваться преимуществами короткого замыкания, вы можете назначить результаты выражений переменным в условии if следующим образом:

  int c1, c2, c3;
  if ((c1 = x < 0) || (c2 = x > 10) || (c3 = x == 5)) {
    if (c1) {
      printf("your number was less than 0\n");
    } else if (c2) {
      printf("your number was greater than 10\n");
    } else {
      printf("wow, your number is equal to 5!\n");
    }
  }

Просто имейте в видучто если условие замыкает накоротко (скажем, x < 0), то значения c2 и c3 не инициализируются.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...