2014-12-14 5 views
1

я следующий код C:Нет math.h include - значение возвращаемой функции sqrt?

#include <stdio.h> 

main() 
{ 
    double wurzelZwei; 
    wurzelZwei = sqrt(2.0); 
    printf("Wurzel 2: %lf\n", wurzelZwei); 
} 

Почему возвращаемое значение «1073742463 квадратный корень» и компилятор/линкер делает только показать предупреждение и не фатальную ошибку, когда libary «math.h» не входит ?

+8

Стандарты только мандат * диагностика *. После этого компилятору не запрещено делать что-либо, что он хочет, но даже может заставить работать, несмотря на то, что он плохо сформирован. Рассмотрим компиляцию с помощью '-std = c11 -Wall -Wextra -pedantic-errors'. – Deduplicator

ответ

11

В C89 и ранее разрешено вызывать функцию, которая не была объявлена. При этом предполагается, что эта функция имеет тип возврата int. Это называется неявным объявлением.

Когда вы вызываете функцию таким образом, но она была определена с использованием типа возврата, отличного от int, вы вызываете неопределенное поведение так же, как если бы вы явно объявили функцию с другим типом возврата, чем вы определили.

Так что в вашем случае происходит то, что вы неявно объявляете sqrt с типом возвращаемого по умолчанию int, поэтому возвращаемое вами значение из sqrt (ложно) интерпретируется как int, а затем int преобразуется в double при сохранении это в wurzelZwei.

+0

Спасибо, но почему результат sqrt является целым числом со значением «1073742463», а не «0», например? –

+1

@MaxGunter a) Неопределенное поведение и b), поскольку первые четыре байта значения, возвращаемого sqrt, имеют значение «1073742463» при интерпретации как целое число (это или потому, что регистр, в котором результат был бы сохранен, если функция фактически вернула int, она содержит это число в этот момент времени - это действительно зависит от вашего компилятора, libc и соглашения о вызове). – sepp2k

Смежные вопросы