在for循环中的多个测试条件在逻辑上与&&和

时间:2013-02-11 00:57:21

标签: c for-loop logical-operators

例如:

for(j=0;t1&&t2&&t3;j++);

如果t1失败,for循环是否会检查t2和t3?

7 个答案:

答案 0 :(得分:2)

C将使涉及逻辑AND和OR的表达式短路,因此只要表达式的结果已知,评估就会停止。给定的表达式是:

t1 && t2 && t3

由于它是一个逻辑AND运算符,一旦t1被评估为false,将跳过对t2和t3的评估,因为整体结果是已知的。

答案 1 :(得分:1)

不,如果你有(值&&任何东西)并且值变为false,则忽略其他所有内容。

答案 2 :(得分:1)

for循环中以及在使用&&||的所有其他情况下,评估从左到右进行,直到知道答案为止。那时评估停止了。这称为短路

这是一个非常重要的功能,因为它可以让您通过先前插入检查来“保护”后续表达式。例如,

if (ptr != 0 && ptr->property == 42) {
}

仅因短路而不会在ptr == NULL崩溃。如果没有它,程序员将被迫写得更不愉快

if (ptr != 0) {
    if (ptr->property == 42) {
    }
}

避免崩溃。

答案 3 :(得分:1)

不,C和C ++保证条件的“短路” - 意味着一旦条件可以确定,“测试”就会停止 - 如果&&的某些内容是假的,那么它确定它可以永远不会是true,如果true中的内容为||,则不能为假。

这样可以安全地执行以下操作:

if (ptr != NULL && ptr->x > 10) ... 

答案 4 :(得分:1)

来自ISO 9899 C standard(这是一个相当新的草案版本,但这个特定的段落自ANSI-C草案以来一直存在)

  

与按位二进制&操作员,&&运营商保证   从左到右的评价;之后有一个序列点   评估第一个操作数。 如果第一个操作数比较相等   为0时,不评估第二个操作数

强调我的,所以是的,编译器必须在遇到一个会导致它返回0的操作数时立即对逻辑和条件进行短路。

答案 5 :(得分:0)

逻辑上它不需要,因为第一个条件为false会使整个语句为false。它在技术上被称为“短路评估”。这就是为什么你不应该创建产生副作用的t2t3条件,并假设它们在循环的每个循环中发生。

答案 6 :(得分:0)

for(j = 0;(t1&& t2)&&(t2&& t3); j ++); //应该工作

误读了这个问题。不,不会。 C使用短路评估,这意味着一旦它是假的,它就是假的。