c - 有人可以解释这两个 for 循环之间的区别吗?
问题描述
int n = strlen(s)
for (int i = 0; i < n; i++)
{
printf("%c", s[i]);
}
for (int i = 0; i <strlen(s); i++)
{
printf("%c", s[i]);
}
我想问的是内存中发生了什么(引擎盖下)。假设字符串长度为 4,将 4 分配给 n,这会使编译器更容易编译吗?在第二个代码中,编译器是否必须一遍又一遍地检查 s 的字符串长度是多少?第一个代码的重点是让编译器记住字符串长度,所以它不需要每次都检查它。如果我的问题不够清楚,我很抱歉,告诉我如何改进将不胜感激。
解决方案
在第二个代码中,编译器是否必须一遍又一遍地检查 s 的字符串长度是多少?
这是完全正确的。for
每次迭代都会评估循环的条件。因此,您应该缓存长度(或任何其他在每次迭代中不会改变的结果,就此而言)。
在这种情况下,正如人们指出的那样,您可以更好地避免计算长度,因为无论如何您都在迭代字符串。
推荐阅读
- c++ - 如何使用闰秒以微秒为单位获取 UTC 时间
- discord - 如何启用多个命令
- swift - 线程 1:尝试在物理设备上运行我的应用程序时出现 EXC_BAD_ACCESS (code=1, address=0x9)
- jenkins - Jenkins 管道不会复制前一阶段生成的文件
- javascript - TypeScript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型
- python - 将 tkinter 设置为始终是当前活动窗口
- webgl - WebGL 渲染抗锯齿
- node.js - 这个通用版本的 mongodb.MongoClient.connect 脚本中的“回调”参数是什么?
- sql - Jupyter Notebook 卡在运行时
- c++ - 如何使用 Flex/Bison 从文件中获取数据并将其存储到其他类的结构数据中?