C++ Zmienne i typy danych: Int, Char, Float, Double
โก Inteligentne podsumowanie
Zmienna w C++ to nazwana lokalizacja pamiฤci, ktรณra przechowuje wartoลฤ, ktรณrฤ Twรณj program moลผe wykorzystaฤ i zmieniฤ. Tutaj dowiesz siฤ C++ typy zmiennych, zasady deklaracji, typy danych, zakres, konwersja typรณw i staลe z przykลadami.
Zmienne w C++
A C++ zmienna zapewnia nam nazwanฤ moลผliwoลฤ przechowywania. Pozwala programiลcie manipulowaฤ danymi wedลug potrzeb. Kaลผda zmienna ma typ C++Typ zmiennej pomaga okreลliฤ rozmiar i ukลad mapy pamiฤci zmiennej, zakres wartoลci, ktรณre mogฤ byฤ przechowywane w tej pamiฤci, oraz zestaw operacji, ktรณre moลผna do niej zastosowaฤ.
Podstawowe typy zmiennych w C++
Oto podstawowe typy C++ zmienne:
wewn.:
Liczba caลkowita to literaล numeryczny (zwiฤ zany z liczbami) bez czฤลci uลamkowej lub wykลadniczej. Przykลad. 120, -90 itd.
Double:
Jest to wartoลฤ zmiennoprzecinkowa podwรณjnej precyzji. Przykลad: 11.22, 2.345
Zwฤglaฤ:
Literaล znakowy tworzy siฤ poprzez umieszczenie pojedynczego znaku w pojedynczym cudzysลowie. Na przykลad: โaโ, โmโ, โFโ, โPโ, โ}โ itd.
Pลywak:
Literaล zmiennoprzecinkowy to literaล liczbowy, ktรณry ma postaฤ uลamkowฤ lub wykลadniczฤ . Na przykลad: 1.3, 2.6
Literaลy tekstowe:
Literaล ciฤ gu to sekwencja znakรณw ujฤta w cudzysลรณw. Na przykลad: โJak siฤ masz?โ
Bool:
Przechowuje wartoลฤ logicznฤ true lub false.
Zasady deklarowania zmiennych w C++
Oto kilka typowych zasad nazywania zmiennych:
- A C++ nazwa zmiennej moลผe zawieraฤ tylko litery, cyfry i znak podkreลlenia.
- A C++ nazwa zmiennej nie moลผe zaczynaฤ siฤ od cyfry.
- Nazwy zmiennych nie powinny zaczynaฤ siฤ od duลผej litery.
- Nazwa zmiennej uลผywana w C++ nie moลผe byฤ sลowem kluczowym. Na przykลad int jest sลowem kluczowym uลผywanym do oznaczania liczb caลkowitych.
- A C++ nazwa zmiennej moลผe zaczynaฤ siฤ od podkreลlenia. Nie jest to jednak uwaลผane za dobrฤ praktykฤ.
C++ Zmienne typy danych
C++ definiuje caลy zestaw typรณw pierwotnych
uniewaลผniฤ typ nie ma ลผadnych powiฤ zanych wartoลci i moลผe byฤ uลผywany tylko w kilku okolicznoลciach. Najczฤลciej jest to typ zwracany przez funkcje, ktรณre nie zwracajฤ wartoลci.
typy arytmetyczne obejmujฤ znaki, liczby caลkowite, wartoลci logiczne i liczby zmiennoprzecinkowe. Typ arytmetyczny jest dalej dzielony na 2 kategorie
- Typy zmiennoprzecinkowe. Typ float (lub float) reprezentuje liczby dziesiฤtne. Standard IEEE okreลla minimalnฤ liczbฤ cyfr znaczฤ cych. Wiฤkszoลฤ kompilatorรณw zwykle zapewnia wiฤkszฤ precyzjฤ niลผ okreลlone minimum. Zazwyczaj floaty sฤ reprezentowane przez 32 bity, double przez 64 bity, a long double przez 96 lub 128 bitรณw.
- Typy integralne (ktรณre obejmujฤ typy znakowe, caลkowite i logiczne). The Boolean type ma tylko dwa typy wartoลci: True lub False. Istnieje kilka zwฤglaฤ typรณw, z ktรณrych wiฤkszoลฤ istnieje w celu wspierania internacjonalizacji. Najbardziej podstawowym typem znaku jest char. Znak ma ten sam rozmiar co pojedynczy bajt maszynowy, co oznacza pojedynczy bajt.
Typy integralne moลผe byฤ podpisany lub niepodpisany.
Podpisany typ: Reprezentujฤ liczby ujemne lub dodatnie (w tym zero). W typie ze znakiem zakres musi byฤ rรณwno podzielony miฤdzy wartoลciami +ve i -ve. Zatem 8-bitowy znak ze znakiem bฤdzie zawieraล wartoลci od โ127 do 127.
Typ bez znaku: W typie bez znaku wszystkie wartoลci wynoszฤ >= 0. 8-bitowy znak bez znaku moลผe zawieraฤ liczby od 0 do 255 (wลฤ cznie).
Nazwa zmiennej lub identyfikatory
Identyfikatory mogฤ skลadaฤ siฤ z kilku liter, cyfr i znaku podkreลlenia lub ich kombinacji. Nie ma ograniczeล co do dลugoลci nazwy.
Identyfikatory muszฤ
- zaczynaฤ siฤ od litery lub znaku podkreลlenia (โ_โ).
- I uwzglฤdniajฤ wielkoลฤ liter; wielkie i maลe litery sฤ rรณลผne:
// definiuje cztery rรณลผne zmienne typu int
int guru99, gurU99, GuRu99, GURU99;
C++ jฤzyk zarezerwowaล pewne nazwy dla swojego uลผytku.
Istnieje wiele przyjฤtych konwencji nazewnictwa zmiennych w rรณลผne jฤzyki programowaniaPrzestrzeganie tych konwencji moลผe poprawiฤ czytelnoลฤ programu.
- Identyfikator powinien przynajmniej w pewnym stopniu wskazywaฤ na jego znaczenie.
- Nazwy zmiennych sฤ zazwyczaj pisane maลymi literami โ guru99, nie Guru99 lub GURU99.
- Definiowane przez nas klasy zwykle zaczynajฤ siฤ od duลผej litery.
- Identyfikatory zawierajฤ ce wiele sลรณw powinny wizualnie rozrรณลผniaฤ kaลผde sลowo. Na przykลad witryna_guru99, a nie witryna guru99.
C++ Deklaracja i definicja zmiennej
Deklaracja zmiennej powoduje, ลผe nazwa jest znana programowi w zakresie, w jakim jest zdefiniowana. Przykลad:
int a=5; int b; char c='A';
int a,b;
a=b=1000;
List initialization int a(5); int b{5};
Kwalifikator staลej w C++
Zaลรณลผmy, ลผe istnieje zmienna buffsize, ktรณra okreลla liczbฤ danych wejลciowych, ktรณre naleลผy pobraฤ od uลผytkownika. Tutaj nie chcemy zmieniaฤ wartoลci buffsize w caลym programie. Chcemy zdefiniowaฤ zmiennฤ , ktรณrej wartoลฤ wiemy, ลผe nie powinna siฤ zmieniaฤ.
W takim przypadku uลผyj sลowa kluczowego const
const int bufSize = 512; // input buffer size
Definiuje to bufSize jako staลฤ . Kaลผda prรณba przypisania lub zmiany bufSize koลczy siฤ bลฤdem.
Tutaj nie moลผemy zmieniฤ wartoลci obiektu const po jego utworzeniu, musi on byฤ obowiฤ zkowo zadeklarowany i zainicjowany. W przeciwnym razie kompilator zgลosi bลฤ d.
const int i = get_size(); // ok: initialized at run time const int j = 42; // ok: initialized at compile time const int k; // error: k is uninitialized const int i = 42; const int ci = i; // ok: the value in i is copied into ci
Zakres zmiennych w C++
Zakres to zakres programu, w ktรณrym zmienna ma znaczenie. Przewaลผnie ta sama nazwa moลผe byฤ uลผywana w odniesieniu do rรณลผnych podmiotรณw w rรณลผnych zakresach. Zmienne sฤ widoczne od momentu ich zadeklarowania aลผ do koลca zakresu, w ktรณrym wystฤpuje ich deklaracja.
#include <iostream> int main() { int sum = 0; // sum values from 1 through 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val cout << "Sum of 1 to 10 inclusive is "<< sum <<endl; return 0; }
Ten program definiuje 3 nazwy, tj. main, sum i val. Uลผywa nazwy przestrzeni nazw std, wraz z dwiema innymi nazwami z tej przestrzeni nazw โ cout i endl.
- Nazwa funkcji โmainโ jest zdefiniowana poza nawiasami klamrowymi. Nazwa funkcji main โ podobnie jak wiฤkszoลฤ innych nazw zdefiniowanych poza funkcjฤ โ ma zasiฤg globalny. Co oznacza, ลผe โโpo zadeklarowaniu nazwy znajdujฤ ce siฤ na Zakres globalny sฤ dostฤpne w caลym programie.
- Suma zmiennej jest definiowana w zakresie bloku bฤdฤ cego treลciฤ funkcji gลรณwnej. Dostฤp do niej moลผna uzyskaฤ z miejsca deklaracji oraz w pozostaลej czฤลci treลci gลรณwnej funkcji. Jednak nie poza nim. Oznacza to, ลผe suma zmienna ma zakres bloku.
- Zmienna val jest zdefiniowana w zakresie instrukcji โforโ. Moลผna go z ลatwoลciฤ uลผyฤ w tym stwierdzeniu, ale nie gdzie indziej w funkcji gลรณwnej. To ma zasiฤg lokalny.
Zagnieลผdลผony zakres
Zakres moลผe zawieraฤ inne zakresy. Zawarty (lub zagnieลผdลผony) zakres nazywany jest zakresem wewnฤtrznym. Zakres zawierajฤ cy jest zakresem zewnฤtrznym.
#include <iostream> using namespace std; // Program for illustration purposes only: It is bad style for a function // to use a global variable and also define a local variable with the same name int reused = 42; // reused has global scope int main() { int unique = 0; // unique has block scope // output #1: uses global reused; prints 42 0 cout << reused << " " << unique << endl; int reused = 0; // new, local object named reused hides global reused // output #2: uses local reused; prints 0 0 cout << reused << " " << unique << endl; // output #3: explicitly requests the global reused; prints 42 0 cout << ::reused << " " << unique << endl; return 0; }
Wyjลcie nr 1 pojawia siฤ przed lokalnฤ definicjฤ ponownego uลผycia. Zatem to wyjลcie
instrukcja to ta, ktรณra uลผywa nazwy reused zdefiniowanej w zasiฤgu globalnym. To stwierdzenie wyprowadza
42 0
Wyjลcie nr 2 wystฤpuje po lokalnej definicji ponownego wykorzystania. Teraz ma to swรณj zakres. Dlatego ta druga instrukcja wyjลciowa po prostu uลผywa obiektu lokalnego o nazwie reused, a nie obiektu globalnego i wynikรณw
0 0
Wyjลcie nr 3 zastฤpuje domyลlny scoping zasady korzystania z operator zakresu. Zakres globalny nie ma nazwy. Tak wiฤc, gdy operator zakresu (::) ma pustฤ lewฤ stronฤ. Interpretuje to jako ลผฤ danie pobrania nazwy po prawej stronie zakresu globalnego. Tak wiฤc wyraลผenie uลผywa globalnego ponownego uลผycia i wyprowadza
42 0
Konwersja typu zmiennej
Zmiennฤ jednego typu moลผna przeksztaลciฤ w inny. Nazywa siฤ to โkonwersjฤ typรณwโ. Zobaczmy zasady konwersji rรณลผnych C++ typy zmiennych:
Przypisanie zmiennej typu bool wartoลci innej niลผ bool zwraca false, jeลli wartoลฤ wynosi 0, a true w przeciwnym wypadku.
bool b = 42; // b is true
Przypisanie wartoลci bool do jednego z pozostaลych typรณw arytmetycznych daje 1, jeลli wartoลฤ bool jest prawdziwa, i 0, jeลli wartoลฤ bool jest faลszywa.
bool b = true; int i = b; // i has value 1
Przypisanie wartoลci zmiennoprzecinkowej do zmiennej typu int daje wartoลฤ, ktรณra jest obcinana. Zapisana wartoลฤ to czฤลฤ przed przecinkiem dziesiฤtnym.
int i = 3.14; // i has value 3
Przypisanie wartoลci int do zmiennej typu float powoduje, ลผe czฤลฤ uลamkowa przyjmuje wartoลฤ zero. Precyzja jest zwykle tracona, jeลli liczba caลkowita ma wiฤcej bitรณw, niลผ moลผe pomieลciฤ zmienna zmiennoprzecinkowa.
Int i=3; double pi = i; // pi has value 3.0
Jeลli sprรณbujemy przypisaฤ wartoลฤ spoza zakresu do zmiennej typu bez znaku, wynikiem bฤdzie pozostaลa czฤลฤ wartoลci %(modulo)
Na przykลad 8-bitowy typ znaku bez znaku moลผe przechowywaฤ wartoลci od 0 do 255 wลฤ cznie. Przypisanie wartoลci spoza tego zakresu spowoduje, ลผe kompilator przypisze resztฤ tej wartoลci modulo 256. Dlatego teลผ, zgodnie z powyลผszฤ logikฤ , przypisanie โ1 do 8-bitowego znaku bez znaku nadaje temu obiektowi wartoลฤ 255.
unsigned char c = -1; // assuming 8-bit chars, c has value 255
Jeลli sprรณbujemy przypisaฤ wartoลฤ spoza zakresu do obiektu typu podpisanego, wynik bฤdzie nieprzewidywalny. Jest nieokreลlone. Program moลผe wydawaฤ siฤ dziaลaฤ na zewnฤ trz, moลผe ulec awarii lub moลผe generowaฤ wartoลci ลmieciowe.
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
Kompilator stosuje ten sam typ konwersji, gdy uลผywamy wartoลci jednego typu, gdy oczekiwana jest wartoลฤ innego typu.
int i = 42; if (i) // condition will evaluate as true i = 0;
Jeลli ta wartoลฤ = 0, wรณwczas warunek jest faลszywy; wszystkie inne (niezerowe) wartoลci dajฤ prawdฤ. Zgodnie z tฤ samฤ koncepcjฤ , gdy uลผywamy boola w wyraลผeniu arytmetycznym, jego wartoลฤ jest zawsze konwertowana na 0 lub 1. W rezultacie uลผycie boola w wyraลผeniu arytmetycznym jest zwykle prawie na pewno nieprawidลowe.
Przestroga: nie mieszaj typรณw podpisanych i niepodpisanych
Wyraลผenia ลฤ czฤ ce znaki ze znakiem i bez znaku mogฤ dawaฤ zaskakujฤ ce i bลฤdne wyniki, gdy wartoลฤ ze znakiem jest ujemna. Jak omรณwiono powyลผej, wartoลci ze znakiem sฤ automatycznie konwertowane na wartoลci bez znaku.
Na przykลad w wyraลผeniu arytmetycznym, takim jak
x* y
Jeลli x wynosi -1, a y wynosi 1 i jeลli zarรณwno x, jak i y sฤ int, to zgodnie z oczekiwaniami wartoลฤ wynosi -1.
Jeลli x jest int, a y jest bez znaku, wartoลฤ tego wyraลผenia zaleลผy od liczby bitรณw liczby caลkowitej na maszynie kompilujฤ cej. Na naszej maszynie to wyraลผenie daje 4294967295.
Zarejestruj zmienne
Dostฤp do zmiennych rejestrowych jest szybszy w porรณwnaniu ze zmiennymi pamiฤciowymi. Tak wiฤc zmienne, ktรณre sฤ czฤsto uลผywane w a C++ program moลผna umieลciฤ w rejestrach za pomocฤ zarejestrowaฤ sลowo kluczowe. Sลowo kluczowe Register mรณwi kompilatorowi, aby przechowaล danฤ zmiennฤ w rejestrze. To wybรณr kompilatora, czy umieลciฤ go w rejestrze, czy nie. Generalnie kompilatory same dokonujฤ rรณลผnych optymalizacji, ktรณre obejmujฤ umieszczenie niektรณrych zmiennych w rejestrze. Nie ma ograniczeล co do liczby zmiennych rejestrowych w pliku a C++ program. Ale kompilator moลผe nie przechowywaฤ zmiennej w rejestrze. Dzieje siฤ tak dlatego, ลผe pamiฤฤ rejestrรณw jest bardzo ograniczona i jest najczฤลciej uลผywana przez system operacyjny.
W celu okreลlenia:
register int i;
Komentarze
Komentarze to fragmenty kodu ignorowane przez kompilator. Umoลผliwia programiลcie robienie notatek w odpowiednich obszarach kodu ลบrรณdลowego/programu. Komentarze majฤ formฤ blokรณw lub pojedynczych wierszy. Komentarze do programu majฤ charakter objaลniajฤ cy. Moลผna go zaliczyฤ do C++ kod, ktรณry pomaga kaลผdemu przeczytaฤ jego kod ลบrรณdลowy. Wszystkie jฤzyki programowania umoลผliwiajฤ jakฤ ล formฤ komentarzy. C++ obsลuguje zarรณwno komentarze jednoliniowe, jak i wielowierszowe.
- Komentarze jednowierszowe to te, ktรณre zaczynajฤ siฤ od // i trwajฤ do koลca linii. Jeลli ostatnim znakiem w wierszu komentarza jest \, komentarz bฤdzie kontynuowany w nastฤpnym wierszu.
- Komentarze wielowierszowe to te, ktรณre zaczynajฤ siฤ od /* i koลczฤ na */.
/* This is a comment */
/* C++ comments can also
* span multiple lines
*/
Sekwencje ewakuacyjne
Niektรณre znaki, takie jak backspace i znaki kontrolne, nie majฤ widocznego obrazu. Takie znaki sฤ znane jako znaki niedrukowalne. Inne znaki (pojedyncze i podwรณjne cudzysลowy, znak zapytania i ukoลnik odwrotny) majฤ specjalne znaczenie w wielu jฤzykach programowania.
Nasze programy nie mogฤ bezpoลrednio uลผywaฤ ลผadnego z tych znakรณw. Zamiast tego moลผemy uลผyฤ sekwencji ucieczki do reprezentowania takiego znaku. Sekwencja ucieczki rozpoczyna siฤ od ukoลnika odwrotnego.
C++ jฤzyk programowania definiuje kilka sekwencji ucieczki:
| Co to robi? | Postaฤ |
|---|---|
| Nowa linia | \n |
| Zakลadka pionowa | \v |
| Ukoลnik wsteczny | \\ |
| Zwrot karetki | \r |
| Zakลadka pozioma | \t |
| Backspace | \b |
| Znak zapytania | \? |
| Wysuw strony | \f |
| Alarm (dzwonek) | \a |
| Double zacytowaฤ | \ โ |
| Pojedynczy cytat | \ ' |
Uลผywamy sekwencji ucieczki tak, jakby byล to pojedynczy znak:
cout << '\n'; // prints a newline cout << "\tguru99!\n"; // prints a tab followed by "guru99!" and a newline
Moลผemy takลผe napisaฤ uogรณlnione sekwencje specjalne \x, po ktรณrych nastฤpuje jedna lub wiฤcej cyfr szesnastkowych. Lub uลผywamy znaku \, po ktรณrym nastฤpuje jedna, dwie lub trzy cyfry รณsemkowe. Uogรณlniona sekwencja ucieczki reprezentuje wartoลฤ liczbowฤ znaku. Kilka przykลadรณw (zakลadajฤ c zestaw znakรณw Latin-1):
\7 (bell) \12 (newline) \40 (blank) \0 (null) \115 ('M') \x4d ('M')
Moลผemy uลผyฤ predefiniowanych sekwencji ucieczki, tak jak uลผywamy dowolnego innego znaku.
cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline cout << '\115' << '\n'; // prints M followed by a newline



