2013-03-25 16 views
9

Sono uno studente di programmazione per principianti, volevo solo imparare la ragione di questo.C90 non consente% lf uso in printf, perché?

Quando uso di questo codice:

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

compilatore dà questo avvertimento. ISO C90 non supporta il 'lf%' formato gnu_printf [-Wformat]

io uso il compilatore gcc nel terminale Ubuntu con (-o -Wall -ansi -pedantic-errori)

Qual è la ragione che sta dietro Questo? Ho cercato sul Web e ho trovato che questo uso è consentito in C99. Perché C90 non ha consentito% lf in uso in printf? Posso usare% .16lf o% .16f ed entrambi stampano con la stessa precisione, quindi qual è il problema che rende% lf cattivo in C90?

+6

Perché non è stato standardizzato fino a più tardi? –

+3

'% lf' non ha alcun uso per la famiglia' printf', solo per la famiglia 'scanf'. –

+0

Possibile duplicato: http://stackoverflow.com/questions/6395726/how-does-printf-and-co-differentiate-beetween-float-and-double –

risposta

8

Secondo C90 documentazione:

un l opzionale (elle) specificando che un seguito d, i, o, u, conversione x, o X specificatore applica a un long int o unsigned long int discussione; un l opzionale che specifica che un identificatore di conversione n seguente si applica a un puntatore a un argomento int lungo; oppure un L facoltativo che specifica che un identificatore di conversione e2, E, f, g o G successivo, , si applica a un argomento lungo doppio. Se un h, l o L viene visualizzato con qualsiasi altro identificatore di conversione, il comportamento è indefinito.

3

C è un linguaggio in evoluzione. Nuove funzionalità e nuovi comportamenti vengono aggiunti in ogni nuova versione dello standard C.

C89 dice che l prima dello f porta a comportamento non definito. E C90 probabilmente dice lo stesso.

C99 d'altra parte dice che l prima di f non ha alcun effetto.

Problemi correlati