Newsgroup: it.comp.lang.c
Titolo: printf()

La funzione printf() serve a stampare a video qualcosa.
Passiamo un atimo alla sintassi:
printf("stringa",8,var, 2*var, num1 = 5, num2 = num2+1, num3++);
tra parentesi ci puo' andare:
- una stringa
- un numero
- una variabile
- una espressione aritmetica
- assegnazioni e incrementi
Ora, una stringa puň coincidere con o contenere una specifica di stampa: %d,
ad esempio.
Ho ora due domande:
1) considerando per analogia scanf(), mi domando:
-come mai in scanf() la stringa deve essere _solo_ una specifica di stampa?
Perchč non puň contenere anche una parola, uno spazio o una newline?
Es.
Questo non mette le due newline:
int main (void)
{
int fret;
printf("Inserisci il numero: ");
scanf("%d\n\n",&fret);
printf("Il numero inserito e': %d",fret);
}
mentre questo sě:
int main (void)
{
int fret;
printf("Inserisci il numero: ");
scanf("%d\n\n",&fret);
printf("Il numero inserito e': %d",fret);
}
Perchč?
2) sempre parlando di argomenti (ma non solo), ma questa volta di printf, mi
pare di aver capito che:
a) num++ (o ++num) equivalga a num = num + 1 e a num += 1
ho letto che l'ultimo (=+) č un operatore di assegnazione, come =, e che
invece ++ č un operatore di autoincremento. Mi domando, ma anche
l'autoincremento č una assegnazione se č vero che:
num++  equivale a   num = num + 1
giusto?
Insomma mi pare di capire che tra gli argomenti di printf() ci possano
essere oltre che espressioni aritmetiche anche delle assegnazioni, i cui
effetti (il valore assegnato cioč) rimangono anche "dopo" la printf().
Insomma:
printf("Il prezzemolo costa %d", prezz = 500);
equivale a :
prezz = 500;
printf("Il prezzemolo costa %d, prezz);
??
b) prezzo = (euro = 50) č possibile perche' il valore di una assegnazione
corrisponde al valore assegnato. Ma credo che sia equivalente questa
interpretazione:
prezzo = euro = 50
č altrettanto possibile perchč le assegnazioni avvengono da dx a sn:
prima  50 viene assegnato a euro, poi euro viene assegnato a prezzo.
E' giusto?
Grazie

 ha scritto nel messaggio
news:cvfbbj$4bd$1...@marina.home.net.it...
Cosa c'e` di differente?
int main (void)
{
    int fret;
    printf("Inserisci il numero: ");
    scanf("%d\n\n",&fret);
    printf("Il numero inserito e': %d",fret);
}
********
int main (void)
{
    int fret;
    printf("Inserisci il numero: ");
    scanf("%d",&fret);
    printf("\n\nIl numero inserito e': %d",fret);
}
********
Eccola: l'avevo dimenticata! La prima nn va, la seconda sě!

50 viene assegnato ad euro, 50 viene assegnato a prezzo.
OK
Grazie

 essere oltre che espressioni aritmetiche anche delle assegnazioni,
La printf è una funzione come qualsiasi altra.
Gli argomenti di QUALSIASI funzione sono sempre e solo espressioni
aritmetiche.
Fra le espressioni aritmetiche rientrano anche le costanti, le variabili,
le addizioni, gli assegnamenti, le chiamate di funzione, ecc. ecc. ecc.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 giusto?
No, ci sono sottili differenze anche se l'effetto e` l'assegnazione a 
num di num + 1.
Lo standard lo tratta separatamente come pre/postfix operator e 
specifica comportamenti ben precisi.


 le addizioni, gli assegnamenti, le chiamate di funzione, ecc. ecc. ecc.
Mi pare di capire che utilizzi la locuzione "espressioni aritmetiche" in
maniera più estensiva che normalmente. Espressione può quindi essere anche
una stringa?
E' una terminologia specifica della programmazione? Io pensavo al concetto
matematico: cioè una specifica combinazione, a mezzo delle 4 operazioni, di
variabili.
Grazie

10 (invio) 11 (invio) 12 (invio)<  '10 11 12'
Cioè con %d posso mettere un numero qualsiasi di spazi, tabulazioni o invii
tra una immissione ed un'altra: i tre numeri vengono sempre memorizzati.
Non capisco la "regola" sottesa al fenomeno!
Grazie

    scanf(" %d %d", &x, &y);
Non ci sto capendo più nulla. Adesso, se provo a compilare con il vecchio
TurboC, funziona tutto come dici tu. Ma se uso Icc, funziona come
specificatop nel post degli esperimenti.
Fammi sapere.
Ciao

 di variabili.
Non solo di variabili ma anche di costanti. E, poi, non necessariamente
c'č un operatore. E le operazioni aritmetiche disponibili non sono
necessariamente solo le quattro della scuola elementare: in matematica hai
anche l'elevamento a potenza, le radici, le funzioni trigonometriche,
ecc.; in C hai anche gli operatori booleani, di assegnamento, di shift,
l'operatore "chiamata di funzione", ecc.


 specificatop nel post degli esperimenti.
Ah, ecco, come volevasi dimostrare: la scanf di questo compilatore Icc ha
probabilmente una scanf che contiene qualche "furbata" non prevista dallo
standard.
Tanto di cappello a chi ha scritto la libreria stdio del compilatore: però
tu, come programmatore, dovresti cercare di non fare affidamento su queste
estensioni, altrimenti i tuoi programmi potrebbero smettere di funzionare
quando passi a un compilatore più sempliciotto.


 standard.
 Purtroppo non lo sapevo. Come devo compotarmi? Cambio compilatore? Io ho
cygwin, un ambiente unix-like che gira sotto windows e possiede il famoso
gcc: provo ad usare quello e poi ritorno con i nuovi esperimenti!
Grazie

101112<               'mi chiede altri due input. ovv.te!'
Se manca una virgola, mi dą errore.
E' come se tutto quello che mi hai spiegato e che ho verificato per %c, non
fosse altrettanto valido per %d. Forse che anche questo compilatore fa delle
furbate, ma solo con i numeri?
Nota che la printf č sempre:
 printf("\nI numeri immessi sono: '%c%c%c'",x,y,z);  per %c
 printf("\nI numeri immessi sono: '%d%d%d'",x,y,z);  per %d
Come va adesso?

 provo ad usare quello e poi ritorno con i nuovi esperimenti!
Ma non è questo il modo giusto di imparare il C! Non si va per tentativi: si
legge un buon manuale e si cerca di capire qual è il modo giusto di fare le
cose.
Ci si deve preoccupare solo se il compilatore NON supporta qualcosa che
dovrebbe supportare, non se supporta qualcosa in più.
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Non capisco la "regola" sottesa al fenomeno!
Difficile capirla andando avanti alla cieca...


 Difficile capirla andando avanti alla cieca...
Hai ragione. Cmq il tuo aiuto č stato molto prezioso: e questo thread
integrerą il mio studio.

 dovrebbe supportare, non se supporta qualcosa in più.
Certo!
Grazie

 Richiedi due numeri senza nessun separatore in mezzo;
No.
   "Input white-space characters (as specified by the isspace
    function) are skipped, unless the specification includes a
    [ , c , or n specifier"
scanf("%d%d", &a, &b);
scanf(" %d%d", &a, &b);
scanf("%d %d", &a, &b);
scanf(" %d %d", &a, &b);
scanf("%d\n%d", &a, &b);
scanf("\n%d\n%d", &a, &b);
sono uguali 
Inserire "white space" (blank,tab,newline) nella la stringa de
controllo davanti %d o %f o %s etc. non ha effetto.
accettano
12 34<RETURN>
ovvero
 12 34<RETURN>
ovvero
<TAB12<TAB><TAB>   34<RETURN>
ovvero
<RETURN>12<RETURN>34<RETURN>
-- 
Horst

E un puntatore, sostanzialmente, è un numero intero.
Non vero.
Puntatore è intero hanno semantiche assolutamente diverse.


 le addizioni, gli assegnamenti, le chiamate di funzione, ecc. ecc. ecc.
Anche friggere un uovo, a sto punto e' un'operazione aritmetica.
La definizione di operazione "aritmetica" e' precisa, la chiamata di
funzione, per esempio NON e' un'operazione aritmetica, quindi affermare
che gli argomenti di funzione sono sempre e solo espressioni ARITMETICHE
non è vero.  Ben diverso e', in generale, il concetto di "espressione"
nella grammatica del linguaggio, che puo' comprendere "misture" di
quasliasi tipo.


 Puntatore č intero hanno semantiche assolutamente diverse.
"Sostanzialmente" non significa "esattamente".
--
Cingar
