首页 > 解决方案 > 单个语句中多个大于/小于操作的效率

问题描述

我目前是一名学习 C 的初学者,并从 Stackoverflow (link)中看到一条语句,即 C 从左到右关联此运算符 (<)。

我从答案中得出的结论是,C 只会从左到右依次运行,而不是人类感知的 (a<b<c),但我还假设如果两个运算符具有相同的关联性,则 C 是还要从左到右运行它,这是正确的吗?

第二部分是,if (a<b<c)实际上是写((a<b) && (b<c))这样的代码不是更有效吗:

#include <stdio.h>

int x = 7 ;

int main() {
   
   if (x > 20)
   {
     printf("y");
   }
   else 
   {
       if (x == 7) 
       {
           printf("n");
       }
       else if (x > 7)
       {
            printf("z");
       }
       else 
       {
           printf("h");
       }
   }
    
    return 0;
}

而不是这个:

#include <stdio.h>


int x = 7;

int main() {
   
   if (7 < x && x <= 20)
   {
     printf("z");
   }
   else if (x > 20)
   {
        printf("y");
   }
   else if (x == 7)
   {
         printf("n");
   }
   else {
        printf("h");
   }
    
    return 0;
}

因为第二个代码比第一个代码做更多的比较操作,这是真的吗?

标签: cperformance

解决方案


在 C 中,&&短路。这意味着如果左侧为假,则不评估右侧。同样,对于||和 左侧也是如此。在这两种情况下,右手边都不影响结果。

这在代码中很重要,例如只有if (p && p->q)在指针p不是取消引用的情况下才会取消引用NULL

话虽如此,这种比较的表现几乎是即时的。它们直接映射到 CPU 指令,不像printf. 您的代码速度将受到该打印的限制。


推荐阅读