2013-07-23 32 views
5

Zastanawiam się, dlaczego wynik tego programu to 5621?printf daje nieoczekiwany wynik

#include <stdio.h> 

main() 
{ 
    int i=56; 
    printf("%d\n",printf("%d",printf("%d",i))); 
    getch(); 
} 
+0

Czy to nawet kompilacja? 'main' nie ma typu zwrotu – StoryTeller

+4

Przeczytaj o [' printf'] (http://en.cppreference.com/w/c/io/fprintf), i co powraca, i poznaj stosy, a zrozumiesz. –

+2

printf: Po sukcesie zwraca całkowitą liczbę zapisanych znaków. – P0W

Odpowiedz

22

printf zwraca liczbę znaków, które zostały wydrukowane.

Najpierw wywołuje się najbardziej wewnętrzną printf z 56, drukując 56. Następnie zwraca liczbę znaków, które wydrukował (2), do środka printf, drukując 2. Następnie ostatecznie liczba wydrukowanych znaków (1) zostaje przekazana do zewnętrznej warstwy printf, która następnie zostaje wydrukowana w celu przetworzenia w postaci 5621.

1

Funkcja printf() zwraca liczbę znaków, które drukuje na konsoli.

Na przykład po następującej rozmowie printf, num_chars będzie miała wartość , ponieważ ciąg "Hi haccks\n" składa się z 10 znaków innych niż nul, które będą drukowane na ekranie.

num_chars = printf("Hi haccks\n"); 
//     ^^^^^^^^^^
//     12345678910  

Uwaga: \n jest pojedynczy 10 th char. Tak więc w powyższym kodzie zwrócono wartość z printf przypisaną do zmiennej num_chars.

W kodzie w danym stwierdzeniem, wewnętrzna printf() drukuje wartości, a następnie powrót liczbę znaków, które cenią wydrukowanych przez zewnętrzną printf, jak pokazano poniżej:

// 1    2   3 
printf("%d\n", printf("%d", printf("%d",i))); // Here i = 56 
     ^   ^  ^ 
    print: 1  print: 2   print: 56 
    returns: 1  returns: 1  returns: 2 
// 3    2    1  <--Order of printf called 

Więc wyprowadza to 5621

+1

@delnan Został on ponownie zredagowany i przeredagowany dla jasności. – gtrig

9

Od wartość

man page

Powrót

Po pomyślnym powrocie te funkcje zwracają liczbę wydrukowanych znaków (z wyłączeniem bajtu zerowego użytego do zakończenia wydruku do ciągów znaków ).

56 jest drukowany na wewnętrznych printf
2 znaki drukowane były więc argument do następnej formacie %d specyfikatorem jest 2
1 znak został wydrukowany przez środkową printf więc argument do zewnętrznej %d formacie specyfikatorem jest 1
Tylko zewnętrzny numer printf zawiera znak nowej linii, więc poprzednie wywołania są wysyłane kolejno po sobie w tej samej linii, co daje 5621\n.

6

printf() zwraca liczbę znaków drukowanych:

printf("%d",i) wyprowadza wartość 56.
printf("%d",printf("%d",i)) Wyjścia 56, a następnie 2, liczba znaków w 56.
wyjścia 56, następnie 2, następnie liczba znaków w 2, która jest 1.

6

To odpowiednik

#include <stdio.h> 

main() 
{ 
    int n, i = 56; 
    n = printf("%d",i); 
    n = printf("%d", n); 
    n = printf("%d\n", n); 
} 

printf zwraca liczbę znaków pisanych.

Powiązane problemy