2011-07-08 23 views
5

Powiel możliwe:
confused about printf() that contains prefix and postfix operators.printf przy użyciu stosu?

natknąłem kod z następującym fragmencie,

int main() { 
    int c = 100; 
    printf("\n %d \t %d \n", c, c++); 
    return 0; 
} 

Spodziewałem wyjście będzie 100 & 101 ale mam wyjścia jako

101  100 

Czy ktoś może mi pomóc wiedzieć, dlaczego?

+0

Domyślam się, że kod analizuje parametry printf w odwrotnej kolejności, dlatego najpierw wstawiany jest cz parametru "C++", następnie wstawiany jest poprzedni parametr c, który jest już inkrementowany. Jeśli chcesz zrobić 1 plus c dla drugiej wartości, a także zwiększyć c, to domyślam się, że będziesz musiał użyć printf ("\ n% d \ t% d \ n", c, c + 1); C++; –

Odpowiedz

-3

printf działa od prawej do lewej, więc pierwsza C++ jest wykonywany (c = 100), a następnie po C++ sporządzi i C = 101 zatem 101 i 100 jest wyprowadzany http://en.wikipedia.org/wiki/Printf

+2

-1. To jest źle. Nie można się spodziewać rezultatu wywołania niezdefiniowanego zachowania. –

+0

to nie jest undefinef http://en.wikipedia.org/wiki/Printf czytaj wiki conajmniej ... domyślnie printf jest wyrównany w prawo – ashmish2

+2

@ ashmish2: jesteś mylący, jak printf przetwarza swoje argumenty i jak argumenty są "przygotowane" na stronie wywoławczej, zanim zostaną przekazane do printf. Ta druga część (kolejność oceny argumentów w wywołaniu funkcji) nie jest określona przez normę. – Mat

5

Nie ma pewności, czy c po lewej stronie lub c++ po prawej stronie zostanie najpierw ocenione.

Kolejność oceny parametrów funkcyjnych jest Unspecifeidniezdefiniowany, a tym samym zachowanie zgodnie z normą.

Zgodnie sekcji 1.9 C++ standardowej:

„Niektóre inne aspekty i operacje abstrakcyjnej maszyny są opisane w niniejszej normy jako unspecified (for example, order of evaluation of arguments to a function), gdzie to możliwe, standardem międzynarodowym. definiuje zbiór dozwolonych zachowań, które określają niedeterministyczne aspekty abstrakcyjnej maszyny. "

+0

Masz duże odważne "Nieokreślone zachowanie" w swoim pytaniu. Ale to nie jest zbyt użyteczne, ponieważ w konsekwencji zachowanie jest niezdefiniowane. Więc powinieneś mieć w sobie co najmniej odważniejsze "Niezdefiniowane zachowanie". –

9

Standardy C i C++ nie gwarantują kolejności oceny parametrów funkcji. Większość kompilatorów oceni parametry od prawej do lewej, ponieważ jest to kolejność, w jakiej są one przekazywane na stos przy użyciu konwencji wywoływania cdecl.

+0

Mężczyzna! Musisz być szybki, odpowiadając na pytania typu "dlaczego mój program robi ", gdy jest niezdefiniowanym zachowaniem. –

+0

http://pl.wikipedia.org/wiki/Printf to nie jest niezdefiniowane – ashmish2

+0

@ ashmish2: "" w komentarzu Davida Hammena nie jest 'printf' (który jest dobrze zdefiniowaną funkcją), ale' c, C++ 'argumenty. To nieokreślone. Zobacz poprzednie pytanie na ten temat: http://stackoverflow.com/questions/3109475/confused-about-printf-that-contains-prefix-and-postfix-operators – MSalters

1

Jeśli właśnie użyłeś printf ("%d\n", c++) lub printf ("%d\n", c), wynik byłby równy 100 w obu przypadkach. Drukowanie zarówno c, jak i C++ w jednym wywołaniu funkcji, tak jak to się stało, to niezdefiniowane zachowanie .

Powiązane problemy