4

我试过这段代码

/*main.c*/
#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */

int frequency_of_primes (int n) {
  int i, j;
  int freq = n - 1;
  for (i = 2; i <= n; ++i)
  for (j = sqrt(i); j > 1; --j)
    if (i%j==0) {--freq; break;}
  return freq;
}

int main() {
  printf("%f\n", sqrt(4.0));
  return 0;
}

并用 编译它gcc main.c,它报告说undefined reference tosqrt' . I already know add-lm` 选项可以解决这个问题。但真正让我吃惊的是:

#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */

// int frequency_of_primes (int n) {
//   int i, j;
//   int freq = n - 1;
//   for (i = 2; i <= n; ++i)
//   for (j = sqrt(i); j > 1; --j)
//     if (i%j==0) {--freq; break;}
//   return freq;
// }

int main() {
  printf("%f\n", sqrt(4.0));
  return 0;
}

main函数也调用sqrt,但ld不报告任何错误。

4

1 回答 1

7

那是因为优化器正在处理您正在使用的常量情况。

问题出在sqrt(i)内部frequency_of_primes()调用,调用main()被优化了。您可以通过阅读为后一种情况生成的代码来弄清楚这一点,它只会加载一个常量2.0并完成它。

于 2015-10-22T10:32:52.670 回答