c - 单个语句中多个大于/小于操作的效率
问题描述
我目前是一名学习 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;
}
因为第二个代码比第一个代码做更多的比较操作,这是真的吗?
解决方案
在 C 中,&&
短路。这意味着如果左侧为假,则不评估右侧。同样,对于||
和 左侧也是如此。在这两种情况下,右手边都不影响结果。
这在代码中很重要,例如只有if (p && p->q)
在指针p
不是取消引用的情况下才会取消引用NULL
。
话虽如此,这种比较的表现几乎是即时的。它们直接映射到 CPU 指令,不像printf
. 您的代码速度将受到该打印的限制。
推荐阅读
- c++ - 如何读取 TXT 文件并在 C 中仅存储 int
- php - 尝试在 Laravel Ubuntu Nginx 服务器上上传图像
- selenium - ERROR:gl_surface_egl.cc(750)] EGL Driver message (Critical) eglInitialize: No available renderers error using ChromeDriver and Chrome with Selenium
- python - cv2.VideoCapture(0)失败后返回python
- reactjs - React:有没有办法缓存组件或防止每次渲染时出现多余的 HTTP 调用
- swift - Swift didReceiveRemoteNotification() Firebase 未被调用
- google-apps-script - 将数据写入谷歌应用脚本中的多个非连续单元格
- sql-server - 处理“批处理执行时发生错误”的一般方法
- git - 如何删除 github 上的文件或文件夹?
- python - SciPy 稀疏矩阵“.multiply”不返回预期结果?