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++程序,则自动获得 LBM链接。

你是否链接到<代码> -LM<代码>,例如:G代码> GCC墙测试?C-LM < /代码>?显示您的确切构建命令和GCC版本,也应该<代码> -STD= C99 < /代码>(或更高版本,例如
-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