2012-09-08 10 views
9

Znalazłem następujący kod dla dodania dwóch liczb bez użycia operatora +.Dodawanie dwóch liczb bez użycia operatorów

kod, aby dodać 3 i 4:

printf("%d",printf("%*c%*c",3,' ',4,' ')); 

Teraz printf() zwraca liczbę znaków w wyniku i %*c ignoruje następny znak, że napotka. Ale nadal nie jestem w stanie zrozumieć tego kodu. Każda pomoc będzie doceniona.

+0

Ten kod ma także pewne znaczące skutki uboczne. –

+0

tylko efekt uboczny Wiem, że przesuwa wyjście w zależności od liczby spacji, które dostaje jako dane wejściowe. coś jeszcze ? – Peps0791

+3

Ale ten efekt uboczny jest poważny. Nie możesz po prostu powiedzieć, że to dziwny sposób na dodanie. –

Odpowiedz

9

printf("%*c", n, c) drukuje znak c, n razy. Tak więc kod wyświetla 3 spacje, po których następuje 4 spacje, a printf zwraca liczbę wydrukowanych znaków, co oczywiście wynosi 3 + 4, kończąc problem.

+2

Właściwie to wypisuje znak "c" wyrównany do prawej na szerokość pola 'n', wypełnioną spacjami. (Niewypełniony kopiami "c", jak sugeruje twoja odpowiedź) –

5

Wewnętrzny printf wyprowadza 3, a następnie 4 spacje i zwraca liczbę znaków, która wynosi 7, a zewnętrzna printf drukuje ten wynik.

1

Dodaję tę odpowiedź, aby określić zasady standardu.

Tutaj wykorzystuje się wartość zwracaną printf. Odpowiednio 3-1 spacje (' '), a następnie ponownie spacje (jak określono) i 4-1 spacje, a następnie ponownie 1 spacja jest drukowana. Następnie zwracana jest całkowita liczba zapisanych znaków. Tak właśnie się robi.

Pamiętam tylko tę regułę

printf("%*c",X,C) prints the char C in a field of size X 

Wszystkie te zachowania są wyjaśnione w C11 Standard.

Od standardowego §7.21.6.1p4

Opcjonalny minimalną szerokość pola. Jeżeli wartość przekształcony ma mniej znaków niż szerokość pola, to jest spacjami (domyślnie) na lewo (lub w prawo, czy w lewo flaga regulacji opisanego dalej nadano) do szerokość pola. Szerokość pola przyjmuje postać gwiazdka * (opisana poniżej) lub nieujemną liczbę całkowitą dziesiętną.

A w tej samej sekcji §7.21.6.1p5

Jak wspomniano powyżej, szerokość pola lub precyzji, lub jedno i drugie, mogą być oznaczone gwiazdką.W tym przypadku, int argumentu dostarcza szerokość pola lub precyzji

wreszcie §7.21.6.1.p14

Funkcja fprintf Zwraca liczbę znaków przekazywane lub wartość ujemną jeśli wystąpił błąd wyjścia lub kodowania.


Aby wyczyścić swój pomysł ten przykład będzie na tyle dobry (używam %d tutaj, aby uzyskać ideę tej dziedzinie).

Jeśli x = 10 i y=2 to będzie

printf("%*d%*d", x, x, y, y); 

Wyraźniej

| | | | | | | | |1|0| |2| 
1 2 3 4 5 6 7 8 9 10 \ \ 
         11 12 

That's how 12 characters are printed. 
Powiązane problemy