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();
}
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();
}
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
.
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
@delnan Został on ponownie zredagowany i przeredagowany dla jasności. – gtrig
Od wartość
man pagePowró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
.
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
.
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.
Czy to nawet kompilacja? 'main' nie ma typu zwrotu – StoryTeller
Przeczytaj o [' printf'] (http://en.cppreference.com/w/c/io/fprintf), i co powraca, i poznaj stosy, a zrozumiesz. –
printf: Po sukcesie zwraca całkowitą liczbę zapisanych znaków. – P0W