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