Parameters evaluatierichting in macro doorgeven

Zoals ik weet in C begint het doorgeven van de werkelijke parameters van een functie-evaluatie van uiterst rechts en gericht naar links. Wat is het geval voor een macrodefinitie met parameter? Ik heb een code gemaakt om het duidelijk te maken, maar de output bracht me in de war ... Hier is de code.,

#define parsing(a,b) a*b

int parsefun(int a, int b)
{
    return a*b;    
}

int main()
{
    int i=10;
    printf("%d\n",parsing((i++),i));
    i=10;
    printf("%d\n",parsing(i,(i++)));
    i=10;

    printf("%d\n",parsefun((i++),i));
    i=10;
    printf("%d\n",parsefun(i,(i++)));
    system("PAUSE");
    return 0;
}

Deze code uitgangen, 100 100 100 110

Ik hoopte dezelfde output voor macro's als functie. Maar waar is het cruciale punt hier?

0
'Zoals ik weet in C' - Omdat je het verkeerd hebt, is het de moeite waard om te overwegen waarom je dacht dat je dat wist, en wat je nog meer zou kunnen laten weten dat je weet dat dat niet klopt.
toegevoegd de auteur Jim Balter, de bron

1 antwoord

het ontleden van de werkelijke parameters van een functie begint van uiterst rechts en gericht naar links

Ik denk dat je 'evaluatie' bedoelt in plaats van 'parsing'. Maar dat is niet waar, de C-standaard specificeert geen bestelling.

Dus het gedrag dat u krijgt voor de functies is niet-gespecificeerd volgens de C-standaard.

Ik hoopte dezelfde uitvoer voor macro's als functie

Macroargumenten worden niet geëvalueerd, ze worden eenvoudigweg vervangen. Dus je eindigt hiermee:

int i=10;
printf("%d\n", (i++) * i);
i=10;
printf("%d\n", i * (i++));

Hierna ziet u eenvoudig ongedefinieerd gedrag , zoals wordt uitgelegd in deze vraag: Waarom zijn deze constructies (met behulp van ++) ongedefinieerd gedrag? .

7
toegevoegd
@alaminhosain Zie www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf (het is in essentie hetzelfde als C99, maar is gratis)
toegevoegd de auteur Jim Balter, de bron
@alaminhosain: omdat voor deze specifieke compiler de functieargumenten van rechts naar links worden geëvalueerd. Maar een andere compiler kan ervoor kiezen om van links naar rechts te doen.
toegevoegd de auteur Oliver Charlesworth, de bron
@alaminhosain: zeker. Zie b.v. sectie 6.5.2.2 paragraaf 10 van de C99-norm.
toegevoegd de auteur Oliver Charlesworth, de bron
Als order niet gespecificeerd is, waarom dan de twee functie-aanroep hierboven een ander resultaat geven? En welke waarde substitueert boven twee macro-substitutie ?? kan je alsjeblieft uitleggen ...
toegevoegd de auteur amin__, de bron
als je het niet erg vindt, geef me alsjeblieft de link van C-standaard .. Ik las uit een boek dat dingen waarschijnlijk naar c wijzen door kanetker
toegevoegd de auteur amin__, de bron
@JimBalter Ik heb dat gedownload..bedankt
toegevoegd de auteur amin__, de bron