OR运算符不评估两个语句,只有1

时间:2012-11-12 12:04:19

标签: c++ boolean-operations

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),并且它不会同时评估它们。

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

4 个答案:

答案 0 :(得分:4)

OR运算符是一个短路运算符,这意味着如果一方评估为true,则另一方从未实际执行过。如果您打算对OR的双方进行评估,那么您可能需要重新考虑代码的编写方式。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

这称为短路。请查看C FAQ

答案 3 :(得分:1)

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

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