1. Podstawowe elementy języka C++
W języku C++ wykorzystuje się zbiór znaków ASCII, zdefiniowany normą
ANSI3.4-1968. Jest to amerykański wariant międzynarodowego, 7-bitowego kodu ISO
646-1983. Elementami tego zbioru sÄ…:
małe i duże litery alfabetu łacińskiego,
cyfry od 0 do 9,
znaki przestankowe i inne symbole specjalne.
Każdy znak zbioru ASCII ma swój numer porządkowy (kod znaku); np. kodem znaku
'A' jest liczba 65 w dziesiętnym systemie liczenia, lub 101 w systemie oktalnym
(ósemkowym). Znaki kodu ASCII zestawiono w Dodatku A.
Ponieważ C++ jest językiem o silnej typizacji, zatem każda nazwa
(identyfikator) w programie musi mieć związany z nią typ, podawany w
deklaracji identyfikatora. Typ określa zbiór wartości, jakie można przypisać
danej nazwie oraz zbiór operacji, jakie można zastosować do takiej nazwy (tj.
do reprezentowanej przez tę nazwę struktury danych), a także sposób
interpretacji poszczególnych operacji.
1.1. Wbudowane typy danych
Każda implementacja języka C++ zawiera dwie kategorie typów danych: typy
wbudowane i typy definiowane przez użytkownika. Zarówno pierwsze, jak i drugie
sÄ… abstrakcyjnymi reprezentacjami rzeczywistych struktur danych.
Pośród typów wbudowanych wyróżnia się typy podstawowe: typ char, typ int, typ
float, typ double, typ bool i typ enum. Nazwy typów podstawowych można
poprzedzać tzw. specyfikatorami typu, tj. słowami kluczowymi short, long,
signed i unsigned, które zmieniają wewnętrzną reprezentację danych tych typów.
Każdy typ wbudowany ma także szereg skojarzonych z nim typów pochodnych:
wskaźniki, referencje i tablice.
Rysunek 1-1 ilustruje typy wbudowane.
Rysunek 1-1 Podstawowe typy danych C++
Poniżej zestawiono sensowne (i najczęściej używane) kombinacje typów i
specyfikatorów.
Dla wielkości (stałych i zmiennych) całkowitych: char, short int, int, long
int. Norma ANSI/ISO stanowi, że zapisów “short int" oraz “long int" nie można w
programach skracać do “short" i “long".
Dla wielkości (stałych i zmiennych) zmiennoprzecinkowych: float, double, long
double.
Dla wielkości całkowitych bez znaku, wartości logicznych, tablic bitowych:
unsigned char, unsigned short int, unsigned int, unsigned long int.
Przy jawnym deklarowaniu wielkości ze znakiem: signed char, signed short int,
signed int.
F Uwaga1. Jeżeli na wielkościach typów char oraz int mają być przeprowadzane
operacje arytmetyczne lub logiczne, to są one najpierw niejawnie przekształcane
do typu int. W analogicznej sytuacji dane typu float są przekształcane do typu
double.
W języku C++ istnieje ponadto typ void, który posiada pusty zbiór wartości. Z
punktu widzenia składni typ void zachowuje się analogicznie do typów
podstawowych (int, char, float, double, enum). Jednakże można go używać jedynie
jako fragmentu typu pochodnego, ponieważ nie ma obiektów typu void. Na pierwszy
rzut oka może się wydawać dziwnym posiadanie typu, dla którego nie ma
zdefiniowanych wartości. Jednak w praktyce typ ten jest bardzo użyteczny,
szczególnie w zastosowaniu do funkcji, które nie zwracają żadnej wartości, a
więc odpowiadają znanym z innych języków programowania procedurom.
F Uwaga 2. Typy char, int (z ewentualnymi specyfikatorami) oraz enum sÄ… Å‚Ä…cznie
nazywane typami całkowitymi. Typy całkowite i zmiennopozycyjne są łącznie
nazywane typami arytmetycznymi.
1.2. Jednostki leksykalne
W języku C++ znajdujemy cztery rodzaje jednostek leksykalnych: identyfikatory,
słowa kluczowe, literały oraz różne separatory. Spacje, znaki tabulacji
poziomej i pionowej, znaki nowego wiersza i nowej strony oraz komentarze
(nazywane Å‚Ä…cznie “biaÅ‚ymi znakami") sÄ… w ogólnoÅ›ci ignorowane, chyba że sÅ‚użą
do separacji jednostek leksykalnych. W procesie kompilacji programu jednostki
leksykalne są wyodrębniane (ang. parsing) z wejściowego strumienia znaków w ten
sposób, że jako następną jednostkę bierze się najdłuższy ciąg znaków po białym
znaku lub po sekwencji takich znaków.
1.2.1. Identyfikatory
Nazwa (identyfikator) jest sekwencją liter i cyfr o dowolnej długości. Pierwszy
znak musi być literą, przy czym znak podkreślenia '_' jest traktowany jako
litera. Rozróżniane są litery małe i duże. Należy unikać stosowania nazw,
zaczynających się od znaku podkreślenia lub dwóch kolejnych znaków
podkreślenia, ponieważ nazwy takie są zarezerwowane dla predefiniowanych
identyfikatorów, m. in. dla bibliotek.
1.2.2. Komentarze
Komentarze są, w pewnym sensie, wizytówką programisty, ponieważ ich zadaniem
jest zwiększenie czytelności programu. Krótkie komentarze mają postać dowolnego
ciągu znaków, zapisywanych w jednym wierszu po symbolu komentarza '//'. Taki
komentarz kończy się wraz z końcem danego wiersza. Dłuższe komentarze zaleca
się umieszczać pomiędzy parami znaków '/*' i '*/'. Jeżeli po symbolu '//' lub
pomiędzy symbolami '/*' i '*/' wystąpią pary znaków '//', bądź pary znaków '/*'
i '*/', to będą one traktowane jak zwykłe znaki (w C++ nie ma komentarzy
zagnieżdżonych). Podobnie jak w innych językach programowania, komentarze
wpływają tylko na wielkość kodu źródłowego, ponieważ są usuwane z programu
przez kompilator przed generacjÄ… kodu wynikowego.
Ponieważ komentarze nie są włączane do wynikowego kodu programu, mogą być w
nich używane polskie znaki diakrytyczne, np. ą, ę, etc. Jest to pewne
ułatwienie dla polskiego programisty, który jest zmuszony korzystać wyłącznie
ze 127 znaków ASCII we wszystkich pozostałych elementach programu.
1.2.3. SÅ‚owa kluczowe i operatory
Zestawione niżej słowa kluczowe są niepodzielnymi ciągami znaków. Są to
zastrzeżone identyfikatory, które można używać jedynie w ściśle zdefiniowanym
kontekście.
Asm
do
inline
Short
typeid
Auto
double
int
Signed
typename
Bool
dynamic_cast
long
Sizeof
union
Break
else
mutable
static
unsigned
Case
enum
namespace
static_cast
using
Catch
explicit
new
struct
virtual
Char
extern
operator
switch
void
Class
false
private
template
volatile
Const
float
protected
this
wchar_t
const_cast
for
public
throw
while
Continue
friend
register
true
Default
goto
reinterpret_cast
try
Delete
if
return
typedef
Jeżeli reprezentacja wewnętrzna kodu źródłowego jest zapisywana w kodzie ASCII,
to poniższe symbole jednoznakowe są używane jako znaki przestankowe lub
operatory:
! % ^ & * ( ) - + = { } | ~
[ ] \ ; ' : " < > ? , . /
Operatorami są również następujące symbole dwu- i trzyznakowe:
-> ++ -- .* ->* << >> <= >= == != &&
|| *= /= %= += -= <<= >>= &= ^= |= ::
Ponadto wiersze tekstu programu źródłowego, które mają być przetwarzane przez
preprocesor, znakuje siÄ™ symbolem '#' w pierwszej kolumnie nowego wiersza.
1.2.4. Stałe całkowite
Stałe całkowite są przykładami literałów stałych; literałów, ponieważ mówimy
jedynie o ich wartościach; stałych, ponieważ ich wartości nie można zmieniać.
Każdy literał jest pewnego typu; np. 2 jest typu int. Stała całkowita jest
traktowana jako całkowita liczba dziesiętna, jeżeli składa się z ciągu cyfr
dziesiętnych. Ciąg cyfr dziesiętnych z zakresu 0-7 jest traktowany jako oktalna
(ósemkowa) liczba całkowita, jeżeli pierwszym znakiem ciągu jest cyfra 0.
Szesnastkowa (ang. hexadecimal) stała całkowita jest ciągiem cyfr
szesnastkowych (cyfry 0-9 i/lub litery a-f, bądź A-F), poprzedzonych
dwuznakowymi symbolami '0x' (zero-x)lub '0X'. Przykłady:
89 //liczba dziesiętna
037 //liczba ósemkowa
0x12 //liczba szesnastkowa
0X7F //liczba szesnastkowa
Typ stałej całkowitej przyjmowany domyślnie przez kompilator zależy od jej
postaci, wartości i przyrostka. Jeżeli jest to liczba dziesiętna i nie ma
przyrostka, to typ domyślny zależy od jej wartości i jest typem int, long int,
lub unsigned long int. Jeżeli jest to liczba oktalna lub szesnastkowa i nie ma
przyrostka, to typ domyślny zależy od jej wartości i jest typem int, unsigned
int, long int, unsigned long int. Dodając specyfikator u bądź U (dla unsigned
int), i/lub l bądź L (dla long int) możemy wymusić inny sposób reprezentacji
stałej całkowitej, np. 25UL, 127u, 38000L.
1.2.5. Stałe zmiennopozycyjne
Stałe zmiennopozycyjne należą do podzbioru liczb rzeczywistych. Można je
zapisywać w notacji dziesiętnej z kropką dziesiętną, np.
0.0 .28 2. -84.17
lub w notacji wykładniczej, np.
1.18e12 -3.1415E-3 3e8
Jeżeli po liczbie nie podano specyfikatora typu, to kompilator nadaje jej typ
domyślny double. Dokładność reprezentacji stałej zmiennopozycyjnej można
wymusić, dodając po zapisie liczby specyfikator f lub F (dla typu floatalbo l
lub L (dla typu long double), np.
-84.17f .28F, 1.0L 3.14159e-3L
1.2.6. Stałe znakowe
Stała (literał) znakowa jest to ciąg, złożony z jednego lub większej liczby
znaków, ujęty w pojedyncze apostrofy, np. 'x'. Stałe jednoznakowe są typu char.
Wartością stałej jednoznakowej jest wartość numeryczna znaku w maszynowym
zbiorze znaków (np. dla zbioru znaków ASCII, wartością 'A' jest 65 dziesiętnie
lub 101 oktalnie). Typem stałej wieloznakowej jest int. Pewne znaki, które nie
mają reprezentacji graficznej na ekranie monitora, czy też na papierze
drukarki, mogą być reprezentowane w programie przez tzw. sekwencje ucieczki,
zapisywane ze znakiem '\' (ang. escape sequences; sÅ‚owo “ucieczka" mówi o tym,
że nastÄ™pny po \ znak “ucieka" od przypisanego mu standardowego znaczenia),
jak pokazano w tablicy 1.1.
Wartości znaków podane w tablicy 1.1 są zapisane w systemie oktalnym lub
szesnastkowym.
Tablica 1.1 Sekwencje ucieczki dla znaków kodu ASCII
Nazwa sekwencji
Symbol
Zapis
znakowy
Wartość
liczbowa
nowy wiersz (new-line)
NL (LF)
\n
12
tabulacja pozioma (horizontal tab)
HT
\t
11
tabulacja pionowa (vertical tab)
VT
\v
13
Ź (backspace)
BS
\b
10
powrót karetki (carriage return)
CR
\r
15
nowa strona (form feed)
FF
\f
14
dzwonek (alert)
BEL
\a
7
\ (backslash)
\
\\
x5c
znak zapytania (question mark)
?
\?
x3f
pojedynczy apostrof (single quote)
'
\'
x27
Podwójny apostrof (double quote)
"
\"
x22
znak zerowy integer()
NUL
\0
0
liczba oktalna (octal number)
ooo
\ooo
ooo
liczba szesnastkowa (hex number)
hhh
\xhh
xhh
1.2.7. Stałe łańcuchowe
Stała (literał) łańcuchowy jest to ciąg o długości zero lub więcej znaków,
ujęty w podwójne apostrofy. Jeżeli w ciągu występują znaki niedrukowalne (np.
BEL), to sÄ… one reprezentowane przez ich sekwencje ucieczki. W reprezentacji
wewnętrznej do każdego łańcucha jest dodawany terminalny znak zerowy '\0' o
wartości 0; tak więc np. łańcuch "abcd" ma długość 5 (a nie 4) znaków, ponieważ
po znaku 'd' kompilator doda znak zerowy '\0'. Jeżeli łańcuch rozciąga się na
kilka wierszy, to na końcu każdego wiersza można dodać znak '\', który
sygnalizuje kompilatorowi, że stała łańcuchowa jest kontynuowana w następnym
wierszu.
Wyszukiwarka
Podobne podstrony:
3 Podstawowe elementy jezyka Prolog01 Podstawy języka UML 2 0PA3 podstawowe elementy liniowe [tryb zgodności]Podstawy mówionego języka tybetańskiego01 podstawy01 podstawowe pojecia01 Podstawy teoretyczne2008 01 Podstawy terapii przeciwzastoinowej dla pacjentow w warunkach domowychBazy Danych Elementy Jezyka SQL cz Iwięcej podobnych podstron