Newsgroup: it.comp.lang.c
Titolo: Ordine di valutazione dei parametri di una funzione

Oggi leggendo il tutorial TrickyC a pag.90 ho letto il seguente passaggio:
----------
Un'altra caratteristica interessante della gestione dei parametri attuali in
C è il fatto che essi sono passati alla funzione chiamata a partire
dall'ultimo, cioè da destra a sinistra. Tale comportamento, nella maggior
parte delle situazioni, è trasparente per il programmatore, ma possono
verificarsi casi in cui è facile essere tratti in inganno:
#include <stdio.h>
void main(void);
long square(void);
long number = 8;
void main(void)
{
    extern long number;
    printf("%ld squared = %ld\n",number,square());
}
long square(void)
{
    number *= number;
    return(number);
}
Il codice riportato non è certo un esempio di buona programmazione, ma
evidenzia con efficacia che printf() riceve i parametri in ordine inverso a
quello in cui sono elencati nella chiamata. Eseguendo il programma, infatti
l'output ottenuto è
64 squared = 64
---------
Allora io sapevo che i parametri vengono passati sullo stack in ordine
inverso, ma che non si possono fare supposizioni sull'ordine di valutazione
degli argomenti della chiamata in quanto cambia da compilatore a
compilatore.
Sono io che sbaglio?
--
________________________________
Togliete NoSpaM per rispondermi
Buone Feste
bye Brain
--
________________________________
Togliete NoSpaM per rispondermi
Buone Feste
bye Brain

Sono io che sbaglio?
Si', sbagli ad affidarti al TrickyC. Io lo definirei lo Schildt
italiano. Il testo in questione si riferisce espressamente ai
compilatori Borland per sistemi DOS.
--
Andrea Laforgia
andrea_...@bigfoot.com

Sono io che sbaglio?
Fino a qualche anno fa c'era per es. il C che passava i parametri in un modo e 
il Pascal che li passava nell'altro, ora c'e' per es. il Delphi (Pascal) che 
accetta funzioni compatibili con la convenzione C e il VisualC/C++ che 
permette di compilare funzioni C con la convenzione del Pascal (in effetti il 
modo di passare i parametri del C non e' il massimo dell'efficienza ma serve 
per i parametri variabili, tipo printf).
Io direi di non fare supposizioni in nessun caso!

L'esempio che riporti riguarda come viene interpretato
il codice che scrivi, non il modo di gestire i parametri nel C.
Con la convenzione PASCAL per il passaggio parametri (l'opposto
di quella C) ti troveresti nelle stesse beghe se volessi compilare
la riga
    printf("%ld squared = %ld\n",square(), number);
I compilatori DOG e WinDog hanno l'estensione ti tipo
"pascal" (vedi manuali) che ti permettono di dichiarare una funzione con
il passaggio dei parametri invertiti.
Lo standard prevede comunque il passaggio dei parametri a partire
dall'ultimo.
Stefano


 compilatori Borland per sistemi DOS.
Dubbio: lo standard dice qualcosa in proposito oppure "comportamento
non definito, a discrezione del compilatore"?
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it


~~~~~~~~~~~~~~~~~
MAINARDI Gianfranco
Burago di Molgora (MI)
Italia
Email : 
main...@libero.it
ICQ# number : 31334916
~~~~~~~~~~~~~~~~~

non definito, a discrezione del compilatore"?
Committee Draft, Agosto 1998, sez. 6.9.1 (Function definitions), pag.
157 (l'enfasi in maiuscolo e' mia) :
[#9]  Each  parameter  has  automatic storage duration.  Its
      identifier is an lvalue, which is in effect declared at  the
      head of the compound statement that constitutes the function
      body (and therefore cannot be  redeclared  in  the  function
      body  except  in  an  enclosed  block).   THE  LAYOUT OF THE   
      STORAGE FOR PARAMETERS IS UNSPECIFIED.
--
Andrea Laforgia
andrea_...@bigfoot.com

 Stefano
Questo riguarda l'ordine di passaggio dei parametri, cioè l'ordine con cui
vengono salvati sullo stack. Ma mi pareva, che gli argomenti possono essere
valutati in un ordine diverso da quello con cui vengono passati
--
________________________________
Togliete NoSpaM per rispondermi
bye Brain