布局表达式的顺序在while循环中是否重要?

时间:2015-10-14 19:13:27

标签: c++ loops while-loop

表达式之间有什么不同:

int a, b;
bool p = false;
while (cin >> a >> b and not p) { // code }

// and:

int a, b;
bool p = false;
while (not p and cin >> a >> b) { // code }

2 个答案:

答案 0 :(得分:7)

不同之处在于,在C ++中,在评估布尔条件时会遵循一个快捷方式。

如果是and,您知道如果第一个语句为false,则整个输出为false。在这种情况下,根本不会评估第二个条件。同样,如果or语句中的第一个语句的计算结果为true,则不评估第二个语句。

那么为什么这很有用,除了在评估第二个语句时节省的费用。其中一个案例是AND,其中如果第一个表达式为false,则可能不希望对第二个表达式求值。原因是如果第一个语句为假,则第二个表达式可能定义不正确。

例如,当访问while循环中的向量元素时,您可能会遇到检查某些情况的情况。除此之外,您还必须注意确保索引在向量的限制范围内。所以你可以写

while (i < vector.size() && condition(vector[i]))

您可以看到,如果第一部分评估为false,那么在条件中访问vector[i]时程序将崩溃。但是,它没有达到这一点。这只是短路运营商的众多用途之一。

答案 1 :(得分:2)

是的,由于short circuit evaluation,订单很重要。

while (cin >> a >> b and not p) 

将接受输入,如果该操作成功,则它将评估p。如果输入失败,那么我们结束循环并且永远不检查p。另一方面:

while (not p and cin >> a >> b)

将评估p,如果not pfalse,那么其余条件将不会被执行。