例如:
for(j=0;t1&&t2&&t3;j++);
如果t1失败,for循环是否会检查t2和t3?
答案 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。它在技术上被称为“短路评估”。这就是为什么你不应该创建产生副作用的t2
和t3
条件,并假设它们在循环的每个循环中发生。
答案 6 :(得分:0)
for(j = 0;(t1&& t2)&&(t2&& t3); j ++); //应该工作
误读了这个问题。不,不会。 C使用短路评估,这意味着一旦它是假的,它就是假的。