Pytanko dotyczące C/C++

Aug 04, 2016 52 Replies

snipped-for-privacy@gmail.com snipped-for-privacy@gmail.com napisał(a):

Spacje przy gwiazdkach nie mają znaczenia dla kompilatora. Natomiast w przypadku int *a, b; lepiej nie robić odstępu po gwiazdce, bo dzięki temu lepiej widać, że a będzie wskaźnikiem, a b nie. To tylko pomoc dla programisty i chyba nie ma innych przypadków gdzie położenie gwiazdki coś zmienia.

snipped-for-privacy@gmail.com snipped-for-privacy@gmail.com napisał(a):

Naprawdę byłoby prościej, gdybyś sam się do dwóch prostych rad zastosował:

- mniej emocji i wulgaryzmów, więcej merytoryki

- jak pytasz o C/C++, to nie wrzucaj filozoficznych rozważań o Pascalu albo co myślisz o składni C. Kogo to interesuje? To nawet nie jest grupa programistyczna.

O tym, że nie lubisz składni C informowałeś już grupę wielokrotnie. Zamiast jednak jako tako poznać w końcu to nieszczęsne C, to ciągle narzekasz na jakieś pierdoły zamiast lepiej poznać filozofię tego języka. A potem się dziwisz, jak ktoś Ci napisze że programowanie nie jest dla Ciebie...

Użytkownik snipped-for-privacy@gmail.com napisał w wiadomości news: snipped-for-privacy@googlegroups.com...

Serio nie widzisz różnicy w czytelności? Patrząc na wszystkie deklaracje w taki sposób: typ coś1, coś2, coś3... i wszystkie coś-e muszą mieć typ równy typ. Jak masz napisane: int *a, b; To od razu widzisz, że zarówno *a jak i b są typu int. A jak napiszesz: int* a, b; to możesz myśleć, że zarówno a jak i b są typu int*, co nie jest prawdą. Dlatego pierwszy zapis jest czytelniejszy, choć oba poprawne.

Ja piszę tak, aby nie mieć nigdy takich wątpliwości. Jak nie jestem na 100% pewien, jak co kompilator zinterpretuje, to nie stosuję takiego zapisu. Moje deklaracje wyglądają np. tak: int i,j,m,n,c; int *p; int *s; int t[10]; Kiedyś jak na całym ekranie mieściło się 25 linijek, a w środowisku typu Turbo C++ okienko dla źródła miało jeszcze mniej to takie marnowanie linijek mogło boleć, ale to już dawno za nami. Poza tym mało kiedy funkcja ma tyle zmiennych.

Nigdy nie pisałem w assemblerze, ale czy "mov a, b" nie zadziała tak samo jak "mov a ,b"? Jeśli tak to zapytam: Dlaczego odmawiasz * prawa do takiego samego zachowania się jak , ?

Wydaje mi się, że dawniej wszystkie deklaracje musiały być na początku bloku funkcji (a może każdego bloku). Możliwość deklaracji typu for(int i=0;i<10;i++) została wprowadzona dla wygody programistów, ale nie ma przymusu. P.G.

Dlatego istnieją coding standardy, niektóre w sposób automatyczny sprawdzane. Zazwyczaj istnieje jawny zakaz deklaracji po przecinku. C/C++ to język o niezwykłych mozliwościach i miliardzie błedów do popełnienia. Coding standardy zazwyczaj bazują na doświadczeniu zespołu z takimi błedami i warto się rozejrzeć jak inni to robią.

Użytkownik napisał w wiadomości grup dyskusyjnych: snipped-for-privacy@googlegroups.com...

Należy z powodu głupich odruchów. Ale nie ma obowiązku

Użytkownik napisał w wiadomości grup dyskusyjnych: snipped-for-privacy@googlegroups.com...

W dniu czwartek, 4 sierpnia 2016 10:42:55 UTC+2 użytkownik Ghost napisał:

tak

Akurat miał rację, z Twoich komentarzy faktycznie można wyciągać taki wniosek. Spróbuj zająć się czymś innym, myślę że jest sporo innych zajęć, które nie będą w Tobie wywoływać tyle frustracji.

Użytkownik "Grzegorz Niemirowski" napisał w wiadomości grup dyskusyjnych:nnv3av$4m9$ snipped-for-privacy@node1.news.atman.pl...

snipped-for-privacy@gmail.com snipped-for-privacy@gmail.com napisał(a):

W c? Np. w przypadku dzielenia.

Poproszę przykład.

Użytkownik "Grzegorz Niemirowski" napisał w wiadomości grup dyskusyjnych:no2hr7$558$ snipped-for-privacy@node2.news.atman.pl...

dla deklaracji int *y;

a=4 /* y;

vs

a=4 / *y;

widać różnicę?

Nędznej baletnicy wadzi rąbek przy spódnicy. :D

Użytkownik napisał w wiadomości grup dyskusyjnych: snipped-for-privacy@googlegroups.com...

nie ma - trzeba poskładać z wielu wyrażeń, ale tego rodzaju syfiate składanki zrobię ci w dowolnym języku

Użytkownik "Ghost" napisał w wiadomości grup dyskusyjnych:57a4da2f$0$15194$ snipped-for-privacy@news.neostrada.pl... Użytkownik "Grzegorz Niemirowski" napisał w wiadomości grup

int *y;

a=4 /* y; vs a=4 / *y;

No widac. Choc jeszcze mamy a=4 /*y; i a=4/*y;

Hm, a jak to bedzie, jesli *y bedzie zdefiniowane przez #define ? No, jak bedzie prawidlowo zdefiniowane, tzn (*y) czy (*(y)), to dobrze bedzie :-)

J.

Domyślam się, że OP miał na myśli tego typu konstrukcję:

unsigned short a = 2; printf("%s\n", a > 0 ? "liczba dodatnia" : "zero");

Co prawda nie odpowiada dokładnie opisowi, ale z reguły właśnie na to skarżą się nowicjusze zanim zrozumieją w jakich sytuacjach to się bardzo przydaje.

Mateusz

Użytkownik "J.F." napisał w wiadomości grup dyskusyjnych:57a4e880$0$12543$ snipped-for-privacy@news.neostrada.pl...

Użytkownik "Ghost" napisał w wiadomości grup dyskusyjnych:57a4da2f$0$15194$ snipped-for-privacy@news.neostrada.pl... Użytkownik "Grzegorz Niemirowski" napisał w wiadomości grup

oraz np. a = 4 / *y

czy to cos zmienia, czy znów się nudzisz?

Ghost snipped-for-privacy@drzewo.pl napisał(a):

Widać, aczkolwiek dla mnie jest to przykład dosyć abstrakcyjny. Nie pamiętam, żebym się z takim przypadkiem spotkał. Co innego deklaracje kilku zmiennych w jednej linijce.

Użytkownik "Grzegorz Niemirowski" napisał w wiadomości grup dyskusyjnych:no2vii$2t8$ snipped-for-privacy@node1.news.atman.pl...

Ghost snipped-for-privacy@drzewo.pl napisał(a):

Nigdy nie dzieliłeś? Czy nie dzieliłeś przez wartość wskazywaną?

Są takie same dla kompilatora (jeżeli kompilator jest kompilatorem C/C++).

Nie są takie same z punktu widzenia filozofii programowania: gwiazdka przyklejona do typu tworzy jakby nowy typ, gwiazdka przyklejona do zmiennej modyfikuje sposób traktowania zmiennej. Nie w sensie standardu, ale w sensie skojarzeń w mózgu programisty.

Nota bene...

Jeżeli ktoś napisze definicję:

int* a,b;

to jest to to samo co

int *a; int b;

a nie jak mogłobysię

int *a; int *b;

Należy każda zmienną definiować /deklarować w osobnej linii/instrukcji. Oraz używać typedef.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required