用C语言表达的“短路”是什么?


14

我听说过在C,C ++,C#,Java和许多其他语言中使用过“短路”一词。这是什么意思?在什么情况下会使用它?


6
有关此概念的Wikipedia文章:en.wikipedia.org/wiki/Short-circuit_evaluation这是对&&操作员评估的一种优化。
wirrbel 2013年

1
@wirrbel我相信它也适用于||……至少应该如此。
Radu Murzea

1
@RaduMurzea确实。对比||&&&|看到的细微差别。有一个简单的程序可以评估1 || printf("yay");vs 0 || printf("yay");1 | printf("yay");vs,0 | printf("yay");以查看差异
wirrbel

Answers:


35

C中的短路是指逻辑运算符未评估其所有参数时。

以和为例&&,很明显,0 && WhoCares不管是什么,WhoCares都是假的。因此,C只是跳过评估WhoCares。同样的1 || WhoCares道理,它将永远是真的。因此,我们可以编写如下代码

CanFireMissiles && FireMissiles()

这样,我们避免进行一些可能无法执行的操作。如果我们不能发射导弹,我们当然不想尝试。这通常用于指针,尤其是文件指针。

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

这以许多其他有用的方式发挥作用,以避免不必要的计算

 isFileReady() || getFileReady()

如果不需要,这样可以避免做额外的工作。


1
任何时候,如果我回答了您的问题,您都可以选中它旁边的复选框以将您的问题标记为已回答
Daniel Gratzer 2013年

7
我不喜欢CanFireMissiles && FireMissiles(),因为这让我怀疑您是在滥用短路触发副作用。我觉得您是在有条件的情况下隐藏动作。此类代码最好用if(CanFireMissiles){FireMissiles();}或编写if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}
布莱恩(Brian

2
我认为唯一的用途是隐藏副作用。通常,通常不是“炸毁城市”排序,而是在C中经常以这种方式完成对指针的引用或使用系统资源之类的事情。参见Wikipedia页面,正在使用的整个部分是“隐藏副作用”
Daniel Gratzer

2
@jozefg,您还可以使用它来防止执行诸如IsInCache(value) || IsInDatabase(value)IsInDatabase可能需要花费时间的昂贵操作(尤其是在使用移动设备且网络延迟成为问题的情况下)。
mgw854 2015年

4

“短路”通常是指“ 短路评估 ”,这是一个通用概念,不仅限于C。

布尔运算符从左到右求值,因此使其他术语不必要的任何术语都是有用的。因此,您以后可能会检查排除其他条件的条件,从而允许对逻辑运算进行部分评估,而不是对整个事物进行评估。

例:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

一个更复杂的示例:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
短路与节省时间无关,而与未被评估有关。未评估的功能也不会产生副作用。
Pieter B

您知道,这== 0不仅是不必要的,而且实际上可能会使某些人感到困惑。
Deduplicator 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.