1

例如:

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

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

4

7 回答 7

2

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

t1 && t2 && t3

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

于 2013-02-11T01:05:28.487 回答
1

不,如果您有 ( value && any ) 并且 value 变为 false ,则其他所有内容都将被忽略。

于 2013-02-11T00:59:29.880 回答
1

在循环和使用or的for所有其他情况下,评估从左到右进行,直到知道答案。至此,评估停止。这称为短路&&||

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

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

不会ptr == NULL因为短路而崩溃。如果不是因为它,程序员将被迫写得不那么愉快

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

以避免崩溃。

于 2013-02-11T01:00:17.050 回答
1

不,C 和 C++ 保证条件的“短路”——这意味着一旦可以确定条件,“测试”就会停止——如果某些东西对 是错误的&&,那么它就确定它永远不会是true,如果有东西true在一个||,它不能是假的。

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

if (ptr != NULL && ptr->x > 10) ... 
于 2013-02-11T01:00:19.567 回答
1

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

与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数

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

于 2013-02-11T01:05:33.833 回答
0

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

于 2013-02-11T00:58:19.173 回答
0

for(j=0; (t1 && t2) && (t2 && t3); j++); // 应该管用

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

于 2013-02-11T00:59:14.613 回答