Оптимизирована ли оценка состояния? Этот код плохой?

1. Представьте себе состояние if (obj.is_x() || obj.is_y() || obj.is_z())
Будет obj.is_y() а также obj.is_z() быть вызванным и оцененным, если obj.is_x() вернулась правда?

2. Это плохая идея (в общем)? Этот код выглядит плохо?

bool isbn13_prefix_valid (const string& prefix)
{
unsigned num = stoi(prefix);
if (num == 978 || num == 979) return 1;  //super common ones
else if (   num >= 0 && num <= 5 || num == 7 || num >= 600 && num <= 649
|| num >= 80 && num <= 94 || num >= 950 && num <= 989
|| num >= 9900 && num <= 9989 || num >= 99900 && num <= 99999)
return 1;
return 0;
}

2

Решение

  1. Нет, не короткое замыкание.

  2. Да, этот код выглядит плохо. Не потому, что это неправильно, а потому, что вы вставляете чрезвычайно длинное условное выражение в один if заявление. Попробуйте рефакторинг вашего кода, чтобы сделать его чище.

7

Другие решения

Ваш код абсолютно в порядке. Я хотел бы видеть комментарий, откуда эти странные цифры, вот и все.

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

Ваш актуальный вопрос: В || б, а оценивается первым. Если это правда, то b не оценивается, и результат является истинным. Если a ложно, то b также оценивается, и результат является истинным или ложным, в зависимости от результата b.

Оптимизирующий компилятор может начать оценку b до завершения оценки a, если он может доказать, что оценка b не имеет побочных эффектов, и если он считает, что (в основном из-за параллелизма в оборудовании) он в среднем быстрее оценивается как по возможности параллельно, даже если некоторые вещи оцениваются, когда в этом нет необходимости. Но это не заметно в результатах вашего кода и только сделает код быстрее.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector