2013-03-25 10 views
9

Jestem początkującym studentem programowania, po prostu chciałem poznać przyczynę tego.C90 nie zezwala na użycie% lf w printf, dlaczego?

Kiedy używam tego kodu:

#include <stdio.h> 
int main() 
{ 
double pi = 3.1415926535897932; 
printf("%lf",pi); 
return 0; 
} 

Kompilator daje to ostrzeżenie. ISO C90 nie obsługuje '% lf' Format gnu_printf [-Wformat]

używam kompilatora gcc w terminalu z ubuntu (-o -Wall -ansi -pedantic-błędów)

co jest powodem to? Szukałem w Internecie i stwierdziłem, że użycie tego jest dozwolone w C99. Dlaczego C90 nie zezwala na użycie% lf w printf? Mogę użyć% .16lf lub% .16f i oba są drukowane z tą samą precyzją, więc co jest przyczyną% LF w C90?

+6

Ponieważ nie został wystandaryzowany do później? –

+3

'% lf' nie ma zastosowania dla rodziny' printf', tylko dla rodziny 'scanf'. –

+0

Prawdopodobny duplikat: http://stackoverflow.com/questions/6395726/how-does-printf-and-co-co-rozróżnianie-pomiędzy-powietrze- i-podwójnie –

Odpowiedz

8

Zgodnie z dokumentacją C90:

opcjonalnie l (ell) określa, że ​​po d, O, U, specyfikator X lub X konwersji stosuje się długie całkowitoliczbowej unsigned long int argument; opcjonalny l określający, że następująca po konwersji n specyfikacja dotyczy wskaźnika do długiego argumentu int; lub opcjonalny L określający, że następujący specyfikator konwersji e, E, f, g lub G stosuje się do argumentu o długim podwójnym długim podwójnym. Jeśli h, l lub L pojawia się z jakimkolwiek innym specyfikatorem konwersji, zachowanie to jest niezdefiniowane.

3

C to rozwijający się język. Nowe funkcje i zachowania są dodawane w każdej nowej wersji standardu C.

C89 mówi, że l przed f prowadzi do niezdefiniowanego zachowania. A C90 prawdopodobnie mówi to samo.

C99 z drugiej strony mówi, że l przed f nie ma żadnego efektu.

Powiązane problemy