Следующий код:
#include <stdio.h>
#include <math.h>
int main(void)
{
long long int a;
scanf("%lld", &a);
printf("%lf", sqrt(a));
return 0;
}
дает вывод:
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
Однако, если я делаю long long int a = 25;
и удаляю оператор scanf
, или просто делаю sqrt(25)
, оба они работают (правильно дают вывод 5.000000
).
Я проверил этот вопрос, но он для C++ и использует перегрузку функций, тогда как afaict C не имеет перегрузки функций (поэтому у нас есть sqrtf
, sqrt
, sqrtl
, если я не ошибаюсь). Более того, приведенный выше код не работает независимо от того, беру ли я long long int
или double
тип a
. Таким образом, вопросы, вероятно, не связаны.
Кроме того, что касается другого связанного вопроса, у меня не возникала ошибка для постоянно определенные значения, что вместо этого имеет место со связанным вопросом.
В чем тогда причина? Почему постоянное значение будет работать для sqrt
, а переменное значение пользовательского ввода - нет?
-lm
Например,gcc -Wall test.c -lm
? - person Achal   schedule 28.10.2018-std=c99
(или позже, например,-std=c11
), так как используетеlong long
- person M.M   schedule 28.10.2018-Wall -lm -std=gnu99 -O2 -o a.out source_file.c
Я также безуспешно пытался использовать-Wall -lm -o a.out source_file.c
. - person Gaurang Tandon   schedule 28.10.2018-lm
должен стоять в конце, как предложил Ачал - person M.M   schedule 28.10.2018