-1
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
{
  ...
}

只有当左侧的文件到达末尾(返回 FALSE)并且它不会同时评估它们时,该条件的行为就像 OR 运算符正在评估右侧的选项。

我知道语句的评估与运算符本身或它自己的优先规则无关,但是我的程序不应该像我想象的那样工作,同时评估两个语句?

4

4 回答 4

4

OR 运算符是一个短路运算符,这意味着如果一侧计算结果为真,则另一侧永远不会实际执行。如果您的意图是评估 OR 的双方,那么您可能需要重新考虑您的代码是如何编写的。

于 2012-11-12T12:06:11.630 回答
4

这就是布尔 OR 在大多数编程语言中的操作方式。这种行为称为短路评估

如果您想始终评估这两个表达式,请单独执行此操作,然后在条件内使用结果:

std::getline(file_1, dummy_1);
std::getline(file_2, dummy_2);
if (file_1 || file_2) { ... }
于 2012-11-12T12:06:55.627 回答
1

这称为短路。请查看C 常见问题解答

于 2012-11-12T12:06:32.210 回答
1

您可以使用按位逻辑运算符 '|' 保证两个表达式的执行。但即便如此,执行顺序也没有在 C 或 C++ 中定义。(Java 将从左到右执行)。

if (readline(this_line) | readline(that_line) ) ...
首先读取哪一行是任意的。

于 2012-11-12T12:08:36.520 回答