假设我有一个大数组,并且我正在执行如下操作:
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
printf("arr[%d]=%d\n", i, arr[i]);
当然,sizeof
的东西不应该每次都计算,所以它应该像这样:
size_t len = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < len; ++i)
printf("arr[%d]=%d\n", i, arr[i]);
我的问题是是否可以假设任何编译器都会自动执行上述优化,因此我使用哪种方法并不重要?或者我应该假设情况并非如此,第二种方法是唯一正确的方法。
最佳答案
没有理由将除法提升到循环条件之外。这甚至不是除法被评估多少次的问题(这是这些情况下通常关心的问题,并且可能需要编译器使用“转义分析”来确定长度值是否可以在迭代之间改变)。简单的事实是 sizeof(arr)/sizeof(arr[0])
是一个常量表达式,将在编译时计算,并且与在那里硬编码一个数字没有什么不同.
关于c - 使用sizeof、strlen等进行重复计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65976323/