Назначение и условное тестирование одновременно в C ++ - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть три функции, которые возвращают целочисленные коды ошибок, например,

int my_function_1(const int my_int_param);
int my_function_2(const int my_int_param);
int my_function_3(const int my_int_param);

Я хочу назначить и одновременно проверить на наличие ошибок для краткости.Будет ли работать следующее и будет переносимым?

int error=0;
...
if ( error ||
     (error = my_function_1(val1) ||
      error = my_function_2(val2) ||
      error = my_function_3(val3)) ) {
   std::cout << "AN ERROR OCCURRED!!!" << std::endl;
}

Спасибо!

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Почему бы не выбросить исключение?

void my_function_1(const int my_int_param);
void my_function_2(const int my_int_param);
void my_function_3(const int my_int_param);

try {
    my_function_1(...);
    my_function_2(...);
    my_function_3(...);
} catch(std::exception& e) {
    std::cout << "An error occurred! It is " << e.what() << "\n";
}
2 голосов
/ 17 сентября 2010

Я не понимаю, почему у вас есть error && в начале функции, но остальные должны делать то, что вы хотите.Оценка короткого замыкания операторов || гарантируется стандартом.Хотя я бы посчитал это плохим стилем.

Редактировать: На основании вашего комментария вам нужно заменить error && на error ||Я также добавлю, что это хорошая причина использовать исключения, а не коды ошибок, это делает ваш код намного проще для чтения.

0 голосов
/ 17 сентября 2010

Да, после незначительного изменения && на || это будет работать. Но это слишком запутанно (использование = в тестах сбивает с толку) с небольшой пользой.

Вы можете перейти на exception строку другого предложенного автора или просто поместить проверенный код в функцию и сделать, как показано ниже.

int checked(){
    int error = 0;
    error = my_function_1(val1); if (error) return error;
    error = my_function_2(val1); if (error) return error;
    error = my_function_3(val1); if (error) return error;
    return error;
}

Полагаю, любой программист легко поймет, что здесь делается.

0 голосов
/ 17 сентября 2010

error инициализируется 0. Так что && всегда будет иметь значение false Таким образом, другие части условия if никогда не оцениваются. Так что этот код не будет работать. Если вы удалите условие &&, код должен работать переносимо, поскольку стандарт гарантирует порядок оценки в этом случае.

...