Tor*_*nny 3 c gcc ld math.sqrt
我试过这段代码
/*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;
}
Run Code Online (Sandbox Code Playgroud)
并编译它gcc main.c,它报道说,undefined reference to开方" . 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;
}
Run Code Online (Sandbox Code Playgroud)
该main函数也会调用sqrt,但ld不会报告任何错误.
那是因为优化器正在处理您正在使用的常量情况.
这是sqrt(i)电话里frequency_of_primes()是这样的问题,在通话main()被优化掉了.您可以通过读取后一种情况的生成代码来解决这个问题,它只需加载一个常量2.0并完成它.