std::ifstream file_1(argv[1]);
std::ifstream file_2(argv[2]);
...
std::string dummy_1;
std::string dummy_2;
...
while(std::getline(file_1, dummy_1) || std::getline(file_2, dummy_2)) // the problem
{
...
}
Условие ведет себя так, как будто оператор OR оценивает опцию справа только в том случае, если файл слева достигает конца (возвращает FALSE) и не оценивает их одновременно.
Я знаю, что оценка оператора не имеет никакого отношения к самому оператору или к его собственным правилам приоритета, но моя программа не должна работать так, как будто я представляю, как оба оператора оцениваются одновременно?
Оператор OR — это оператор короткого замыкания, означающий, что если одна сторона оценивает значение true, то другая сторона фактически никогда не выполняется. Если ваше намерение состоит в том, чтобы обе стороны ИЛИ были оценены, вы можете пересмотреть, как написан ваш код.
Вот как логическое ИЛИ работает в большинстве языков программирования; это поведение называется оценка короткого замыкания.
Если вы хотите всегда оценивать оба выражения, делайте это по отдельности, а затем используйте результаты внутри условного выражения:
std::getline(file_1, dummy_1);
std::getline(file_2, dummy_2);
if (file_1 || file_2) { ... }
Это называется коротким замыканием. Пожалуйста, проверьте C FAQ.
Вы можете использовать побитовый логический оператор ‘|’ чтобы гарантировать выполнение обоих выражений. Но даже тогда порядок выполнения не определен в C или C ++. (Java будет выполняться слева направо).
if (readline(this_line) | readline(that_line) ) ...
какая строка читается первой, является произвольной.