在 while 循环中,布尔表达式的顺序很重要吗?

4

以下是一个类似表达式的不同之处:

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 }

3
在C++中,“not”和“and”通常分别用“!”和“&&”来表示。 - Keith Thompson
2个回答

8
区别在于,在C++中,在计算布尔条件时使用了快捷方式。
对于“and”,如果第一个语句为假,则整个输出为假。在这种情况下,第二个条件将不会被评估。类似地,如果“or”语句中的第一个语句评估为true,则第二个语句将不被评估。
那么,除了在评估第二个语句时节省一点时间以外,这有什么用呢?其中一个案例是“AND”的情况,其中如果第一个表达式为假,则可能不想评估第二个表达式。其原因是,如果第一个语句为false,则第二个表达式可能未定义。
例如,在“while”循环中访问向量元素时,您可能会遇到需要检查某些条件的情况。除此之外,您还需要确保索引位于向量的限制范围内。所以,您可以只写:
while (i < vector.size() && condition(vector[i]))

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

太好了!谢谢,我一直在为那个问题苦恼。 - tonibofarull
@Steve:说得好。个人而言,我从不使用 andor 。我更喜欢 &&|| 。我将它们写成大写字母只是为了指出它们是布尔运算符。 - therainmaker
我同意 - 我知道 andor 的存在只是因为这个问题!(也许我曾经知道,但从未使用过,所以...) - Steve
@PingwinTux 那有什么有趣的?这正如我所预期的运行。 - JorenHeit
@JorenHeit:也许我应该给出更复杂的解释。简短的评估有时可以替代简单的if语句。在C++ 0x中使用lambda表达式是一种简单的方法。 - Pingwin Tux
显示剩余2条评论

2
是的,顺序很重要,因为涉及到短路求值
while (cin >> a >> b and not p) 

将输入作为参数,如果操作成功,则评估p。如果输入失败,则结束循环并且不检查p。另一方面:
while (not p and cin >> a >> b)

将评估变量p,如果“not p”为“false”,则其余条件将不会被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接