Autor: Dondu
Kurs języka C: Spis treści
Stała to "jakby" zmienna, ale bez możliwości zmiany wpisanej do niej wartości.
Stałe definiuje się tak samo jak zmienne podając jej typ, nazwę i wartość, co pozwala kompilatorowi na kontrolowanie poprawności jej używania w pisanym kodzie. Szczegółowe zasady są takie same jak dla zmiennych (czytaj w dziale o zmiennych).
Stałe definiujemy jak zmienną poprzedzając słowem const.
Przykład 1 (w kompilatorze)
//definiujemy stałe const char ilosc_koni =23; const int ilosc_krow = 5; const float ciezar =170.5f; //f - ponieważ domyślnie ułamkowa liczba to double, //a zmienna ciezar ma być typu float const double dlugosc =12344.17;
Przekonajmy się co się stanie, gdy spróbujemy zwiększyć stałą o jeden.
Załaduj przykład nr 2 w kompilatorze CManiak i dokonaj kompilacji.
Przykład 2 (w kompilatorze)
//definicja stałej const int ilosc_krow = 5; //próba zwiększenia o jeden wartości stałej ilosc_krow++;
Podobnie, gdy spróbujemy ponownie zdefiniować stałą.
Zobacz w kompilatorze CManiak. co się stanie po skompilowaniu przykładu nr 3.
Przykład 3 (w kompilatorze)
//definiujemy stałą const int ilosc_krow = 5; //próba ponownego zdefiniowania stałej const int ilosc_krow = 67;
Stałe globalne
Tak jak w przypadku zmiennych stałe mogą być zdefiniowane jako globalne, przez co stają się dostępne w dowolnej części programu.
Przykład 4 (w kompilatorze)
//definicja stałej globalnej const char ilosc_koni; void jakas_funkcja(void){ //stałe globalne są dostępne w tej funkcji printf("w funkcji ilosc_koni = %d \n", ilosc_koni); } int main(void) { jakas_funkcja(); //wywołaj funkcję //stałe globalne są dostępne w main() printf("w main() ilosc_koni = %d \n", ilosc_koni); return 0; }
Stałe lokalne
Tak samo jak w przypadku zmiennych definiowana lokalnie stała, przykrywa stałą zdefiniowaną globalnie. Sprawdź w kompilatorze CManiak przykład nr 5.
Przykład 5 (w kompilatorze)
//definicja stałej globalnej const char ilosc_koni = 23; void jakas_funkcja(void){ //definicja stałej lokalnej w funkcji //przykrywa definicję stałej globalnej o tej samej nazwie const char ilosc_koni = 100; //stałe globalne są dostępne w tej funkcji printf("w funkcji ilosc_koni = %d \n", ilosc_koni); } int main(void) { jakas_funkcja(); //wywołaj funkcję //stałe globalne są dostępne w main() printf("w main() ilosc_koni = %d \n", ilosc_koni); return 0; }
Kurs języka C: Spis treści
18
A co z #define? Można tak definiować stałe wartości? Również nie da się ich zmieniać podczas programu. Są tego jakieś konsekwencje?
OdpowiedzUsuńW moim odczuciu stosowanie np. "#define JAKAS_NAZWA 14" ma wady i zalety. Zaletą jest to, że stała nie jest wtedy typową zmienną, bo to preprocesor podmienia każde wystąpienie JAKAS_NAZWA w kodzie na przypisaną stałą o wartości 14. Jeśli więc kod da się przetłumaczyć na instrukcje nie odwołujące się do komórki pamięci, tylko mające wpisaną wprost wartość, to tak to chyba jest robione (może obecnie kompilatory są takie mądre, że i przy stałych tak robią, jeśli sytuacja pozwala?), co oszczędza konieczność odczytu z RAM. Kolejna sprawa, jeśli wartość zaszywana jest w instrukcji, to nie zajmuje niepotrzebnie RAMu, do którego kopiowane są domyślnie zmienne.
UsuńWadą natomiast jest gorsza kontrola nad rozmiarem / typem zmiennej oraz, co czasem jest nie do przeskoczenia, utrata standardowych mechanizmów dotyczących zmiennych, czyli przekazywanie adresów, wskaźników, inkrementacja/dekrementacja adresów i skakanie jak po tablicy zmiennych...
Z wymienionymi przez ciebie wadami się zgodzę, ale z zaletami jużnie. Obecnie kompilatory są sprytne, a właściwie zawsze były. Problem w tym, że wiele osób nie informuje kompilatora o swoich zamiarach. Wystarczy zdefiniować stałą w C jako np. static const i już nie będzie potrzeby użycia w tym kontekście #define.
UsuńDefine omówię (w przyszłości) osobno, bo dot. preprocesora.
OdpowiedzUsuńI jak? Może by coś skrobnąć na temat dyrektywy #define ?
OdpowiedzUsuń... tylko ten czas ... dlaczego nie jest z gumy? :-)
Usuń