【问题标题】:OR operator doesn't evaluate both statements, only 1OR 运算符不评估两个语句,只有 1
【发布时间】:2012-11-12 12:04:18
【问题描述】:
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 运算符正在评估右侧的选项。

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

【问题讨论】:

  • 不,它应该首先评估 LHS,并且只有当 LHS 评估为假时才评估 RHS,如您所见。这称为“短路”评估。

标签: c++ boolean-operations


【解决方案1】:

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

【讨论】:

  • 我不能打破这种行为?为了确保将 2 个文件保留在同一个索引上,我必须使用迭代器?
  • @user1802174 您可以通过将表达式更改为!std::getline(file_1, dummy_1) && !std::getline(file_2, dummy_2) 来解决它。如果 一个 std::getline 调用失败,它将退出循环。
【解决方案2】:

这就是布尔 OR 在大多数编程语言中的操作方式;这种行为称为short-circuit evaluation

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

std::getline(file_1, dummy_1);
std::getline(file_2, dummy_2);
if (file_1 || file_2) { ... }

【讨论】:

  • 好主意,但是让我的程序有点过于复杂,无法仅对 2 个文件进行迭代 ...
  • @user1802174:为什么这“太复杂”?
  • @user1802174:它使程序更冗长,而不是复杂。但是您实际上别无选择:要么选择这个,要么更改条件内的运算符,恕我直言,这是误导性的,并且会使代码容易引入错误。
  • @shuttle87 我使用“复杂”这个词的意思是这会变得更加冗长。
  • @Jon 这毕竟是一个好点......为什么没有人建议使用迭代器?
【解决方案3】:

这称为短路。请查看C FAQ

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多