C 为什么sqrt函数不适用于通过用户输入获取的值?
以下代码:C 为什么sqrt函数不适用于通过用户输入获取的值?,c,sqrt,C,Sqrt,以下代码: #include <stdio.h> #include <math.h> int main(void) { long long int a; scanf("%lld", &a); printf("%lf", sqrt(a)); return 0; } 然而,如果我做long int a=25并删除scanf语句,或者简单地执行sqrt(25),两者都可以工作(正确地给出输出5.000000) 我检查过,但它是C++的
#include <stdio.h>
#include <math.h>
int main(void)
{
long long int a;
scanf("%lld", &a);
printf("%lf", sqrt(a));
return 0;
}
然而,如果我做long int a=25
并删除scanf
语句,或者简单地执行sqrt(25)
,两者都可以工作(正确地给出输出5.000000
)
我检查过,但它是C++的,使用函数重载,而AfICT C没有函数重载(这就是为什么我们有<代码> SqRTF ,<代码> Sqrt,<代码> SqRTL如果我没有错的话。此外,无论我采用
long-long-int
还是double
类型的a
,上述代码都会失败。因此,这些问题可能并不相关。另外,关于另一个问题,对于我来说,不断定义的值并没有发生错误,而链接问题恰恰是这样
那么原因是什么呢?为什么常量值适用于
sqrt
,而变量用户输入值则不适用?如评论中所述,您没有链接到libm
,因此sqrt
在链接时未定义
为什么常量值适用于sqrt
,而变量用户输入值不适用
因为GCC将sqrt
识别为一个变量,并且能够在编译时计算编译时常量的平方根,并且完全放弃对sqrt
的调用,从而避免了随后的链接器错误
ISO C90功能<代码>sqrt。。。除非指定了-fno-builtin
(或为单个功能指定了-fno-builtin-
功能
)
如果您要添加
-fno内置sqrt
,那么无论您将什么传递到sqrt
函数中的stdlib.h
和stdio.h
函数在libc.so
(或libc.a
用于静态链接),都会看到链接器错误,默认情况下链接到可执行文件中(好像指定了-lc
)
可以指示GCC使用-nostlib
或-nodefaultlibs
选项避免此自动链接
math.h中的函数在libm.so
中有实现(或libm.a
用于静态链接),默认情况下libm不链接
基本上,C++运行时<代码> LBSTDC++< /COD>要求代码> LBM</C++ >,所以如果用GCC(G++)编译C++程序,则自动获得
-std=c11
)由于使用long
@M.M-Wall-lm-std=gnu99-O2-o a.out source_file.c
,我也尝试了-Wall-lm-o a.out source_file.c
,但没有成功。@GaurangTandon-lm
必须在结尾,正如Achal所建议的那样
source_file.c: In function ‘main’:
source_file.c:9:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld", &a);
^
/tmp/ccWNm2Vs.o: In function `main':
source.c:(.text.startup+0x65): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status