Dyskusja:C/Zmienne

Z Wikibooks, biblioteki wolnych podręczników.

"W przeciwieństwie do języka C++, w C stała to cały czas zmienna, której kompilator pilnuje, by nie zmieniła się. Z tego powodu w C nie można użyć stałej do określenia wielkości tablicy i należy się w takim wypadku odwołać do wcześniej wspomnianej dyrektywy #define." Czy ktoś mógłby mi wyjaśnić o co chodzi w tym akapicie? Bo np. niniejszy kod kompiluje się całkiem poprawnie:

int main(void) {
    int b[10];
    const int a = sizeof b / sizeof *b;
    return 0;
}

odp: Zauważ, że w tym kodzie wielkość tablicy określasz stałą 10, a nie zmienną a (która jest const). W tym akapicie chodzi o to, że niedopuszczana jest taka operacja:

int main(void) {
    const int a = 10;
    int b[a];
    return 0;
}

Natomiast w linijce dalej masz jedynie nadanie początkowej wartości zmiennej z modyfikatorem const, co jest jak najbardziej dozwolone. Pozdro.

W ogóle w C++ stałą to także zmienna. W końcu można pobrać adres stałej zarówno w C jaki w C++.

"Język C nie inicjalizuje zmiennych. Oznacza to, że w nowo zadeklarowanej zmiennej znajdują się śmieci - to, co wcześniej zawierał przydzielony zmiennej fragment pamięci. Aby uniknąć ciężkich do wykrycia błędów, dobrze jest inicjalizować wszystkie zmienne w momencie zadeklarowania."

Moim zdaniem C inicjalizuje zmienne globalne (tzn. jest to zapewnione przez C99, jeśli chcecie mogę grzebnąć standard ansi czy na pewno, choć nie chce mi się. ;D A jestem prawie pewien.) Spróbuję to tam dziś dopisać, chyba, że zaprotestujecie. Tomasz bla Fortuna 14:50, 14 maj 2007 (CEST)

ad.1 raczej chodzi tutaj o kod:
const int a = 2;
int b[a];
ad.2 poniższy kod:
#include <stdio.h>
int main()
{
int a;
printf ("%d\n",a);
}
przy kompilacji z opcją -std=c99 w GCC daje losowe liczby.
kod:
#include <stdio.h>
int a;
int main()
{
printf ("%d\n",a);
}
daje już tylko 0. --Kj 15:56, 14 maj 2007 (CEST)

No to dokładnie tak - lokalne losowe, w końcu leżą na stosie który co chwile się zmienia, a globalne - są zerowane. Tylko tekst uogólnie określenie "c nie inicjalizuje zmiennych" na wszystkie typy. I co do GCC to jestem pewien, że tak jest. Nie wiem tylko jak to się przekłada na inne kompilatory (bardziej egzotyczne) jak standard wymaga - no to nie ma mocy. Najwyżej kompilator jest źle napisany. Tomasz bla Fortuna 22:54, 15 maj 2007 (CEST)

Tak przy okazji - jeśli widzisz jakieś ewidentne błędy, niedociągnięcia, niedomówienia lub innego rodzaju niedoskonałości, to śmiało edytuj i poprawiaj zauważone pomyłki ;-). --Kj 16:52, 16 maj 2007 (CEST)

Spis treści

[edytuj] Uwagi

Chciałbym poruszyć dosyć ważną kwestie otóż czy konieczne jest odnoszenie się do języka C++ w każdym rozdziale tej książki ? w końcu jest to książka związana z językiem proceduralnym jakim jest C, a nie porównywanie go z innymi językami. Rozumiem w niektórych przypadkach warto zwrócić na to uwagę że nie które koncepcje zapożyczone z innych języków czasem mogą działać ( w zależności od użytego kompilatora) np. komentarze // i że to nie jest standardem C ale można z tego w niektórych przypadkach skorzystać. Ale takie odnoszenie się jak np. w tym dziale, akapit Uwagi, nie widzę najmniejszego sensu zamieszczać takich informacji. Może to prowadzić do wprowadzania czytelnika w błąd. POzdrawiam >>mtfk

[edytuj] linki wew.

Modyfikator (...) przydaje się w wąskich zastosowaniach, jak współbieżność i współdzielenie zasobów oraz przerwania systemowe. -- może przydałyby się tu linki wewnętrzne ? __ 77.65.160.223 15:25, 11 cze 2009 (CEST)

Mógłbyś doprecyzować, o jakie linki wewn. tutaj chodzi? Pozdrawiam --Kj 23:49, 12 cze 2009 (CEST)

[edytuj] Pytanie

Dlaczego nie ma ani słowa o kwalifikatorze restrict? Pozdrawiam, Karol

[edytuj] Zmienna bool

Dlaczego nigdzie nie ma mowy o zmiennych typu bool. Może wymagają korzystania z dodatkowych bibliotek, ale wypadało by o nich coś powiedzieć. 87.207.201.179