C/Składnia
W przygotowaniu: dodać informacje o literałach z http://c.comsci.us/etymology/literals.html |
Symbole i słowa kluczowe
[edytuj]Język C definiuje pewną ilość słów, za pomocą których tworzy się np. pętle itp. Są to tzw. słowa kluczowe, tzn. nie można użyć ich jako nazwy zmiennej, czy też stałej (o nich poniżej). Oto lista słów kluczowych języka C (według norm ANSI C z roku 1989 oraz ISO C z roku 1990):
Słowo | Opis w tym podręczniku |
---|---|
auto | Zmienne |
break | Instrukcje sterujące |
case | Instrukcje sterujące |
char | Zmienne |
const | Zmienne |
continue | Instrukcje sterujące |
default | Instrukcje sterujące |
do | Instrukcje sterujące |
double | Zmienne |
else | Instrukcje sterujące |
enum | Typy złożone |
extern | Biblioteki |
float | Zmienne |
for | Instrukcje sterujące |
goto | Instrukcje sterujące |
if | Instrukcje sterujące |
int | Zmienne |
long | Zmienne |
register | Zmienne |
return | Procedury i funkcje |
short | Zmienne |
signed | Zmienne |
sizeof | Zmienne |
static | Biblioteki, Zmienne |
struct | Typy złożone |
switch | Instrukcje sterujące |
typedef | Typy złożone |
union | Typy złożone |
unsigned | Zmienne |
void | Wskaźniki |
volatile | Zmienne |
while | Instrukcje sterujące |
Specyfikacja ISO C z roku 1999 dodaje następujące słowa:
- bool
- _Complex
- _Imaginary
- inline
- restrict
Uwaga!
|
Polskie znaki
[edytuj]Pisząc program, możemy stosować polskie litery (tj. "ąćęłńóśźż") tylko w:
- komentarzach
- ciągach znaków (łańcuchach)
Niedopuszczalne jest stosowanie polskich znaków w innych miejscach.
Operatory
[edytuj]Operatory arytmetyczne
[edytuj]Są to operatory wykonujące znane wszystkim dodawanie, odejmowanie itp.:
operator | znaczenie |
---|---|
+ | dodawanie |
- | odejmowanie |
* | mnożenie |
/ | dzielenie |
% | dzielenie modulo - daje w wyniku samą resztę z dzielenia |
= | operator przypisania - wykonuje działanie po prawej stronie i wynik przypisuje obiektowi po lewej |
Operatory logiczne
[edytuj]Służą porównaniu zawartości dwóch zmiennych według określonych kryteriów:
Operator | Rodzaj porównania |
---|---|
== | czy równe |
> | większy |
>= | większy bądź równy |
< | mniejszy |
<= | mniejszy bądź równy |
!= | czy różny(nierówny) |
Są jeszcze operatory służące do grupowania porównań (patrz też: logika w Wikipedii):
|| | lub(OR) |
&& | i,oraz(AND) |
! | negacja(NOT) |
Operatory binarne
[edytuj]Są to operatory, które działają na bitach.
operator | funkcja | przykład |
---|---|---|
| | suma bitowa(OR) | 5 | 2 da w wyniku 7 ( 00000101 OR 00000010 = 00000111) |
& | iloczyn bitowy | 7 & 2 da w wyniku 2 ( 00000111 AND 00000010 = 00000010) |
~ | negacja bitowa | ~2 da w wyniku 253 ( NOT 00000010 = 11111101 ) |
>> | przesunięcie bitów o X w prawo | 7 >> 2 da w wyniku 1 ( 00000111 >> 2 = 00000001) |
<< | przesunięcie bitów o X w lewo | 7 << 2 da w wyniku 28 ( 00000111 << 2 = 00011100) |
^ | alternatywa wyłączna | 7 ^ 2 da w wyniku 5 ( 00000111 ^ 00000010 = 00000101) |
Operatory inkrementacji/dekrementacji
[edytuj]Służą do dodawania/odejmowania od liczby wartości jeden.
Przykłady:
Operacja | Opis operacji | Wartość wyrażenia |
---|---|---|
x++ | zwiększy wartość w x o jeden | wartość zmiennej x przed zmianą |
++x | zwiększy wartość w x o jeden | wartość zmiennej x powiększona o jeden |
x-- | zmniejszy wartość w x o jeden | wartość zmiennej x przed zmianą |
--x | zmniejszy wartość w x o jeden | wartość zmiennej x pomniejszona o jeden |
Parę przykładów dla zrozumienia:
int a=7; if ((a++)==7) /* najpierw porównuje, potem dodaje */ printf ("%d\n",a); /* wypisze 8 */ if ((++a)==9) /* najpierw dodaje, potem porównuje */ printf ("%d\n", a); /* wypisze 9 */
Analogicznie ma się sytuacja z operatorami dekrementacji.
Pozostałe
[edytuj]Operacja | Opis operacji | Wartość wyrażenia |
---|---|---|
*x | operator wyłuskania dla wskaźnika | wartość trzymana w pamięci pod adresem przechowywanym we wskaźniku |
&x | operator pobrania adresu | zwraca adres zmiennej |
x[a] | operator wybrania elementu tablicy | zwraca element tablicy o indeksie a (numerowanym od zera) |
x.a | operator wyboru składnika a ze zmiennej x | wybiera składnik ze struktury lub unii |
x->a | operator wyboru składnika a przez wskaźnik do zmiennej x | wybiera składnik ze struktury gdy używamy wskaźnika do struktury zamiast zwykłej zmiennej |
sizeof(typ) | operator pobrania rozmiaru typu | zwraca rozmiar typu w bajtach |
sizeof wyrażenie | operator pobrania rozmiaru typu | zwraca rozmiar typu rezultatu wyrażenia |
Operator ternarny
[edytuj]Istnieje jeden operator przyjmujący trzy argumenty - jest to operator wyrażenia warunkowego: a ? b : c. Zwraca on b gdy a jest prawdą lub c w przeciwnym wypadku.
Typy danych
[edytuj]Typ | Opis | Inne nazwy |
---|---|---|
Typy danych wg norm C89 i C90 | ||
char |
|
signed char |
signed char |
|
char |
unsigned char |
|
|
short |
|
short int, signed short, signed short int |
unsigned short |
|
unsigned short int |
int |
|
signed int, signed |
unsigned |
|
unsigned int, size_t |
long |
|
long int, signed long, signed long int |
unsigned long |
|
unsigned long int |
float |
|
|
double |
|
|
long double |
|
|
Typy danych według normy C99 | ||
bool |
|
|
long long |
|
long long int, signed long long, signed long long int |
unsigned long long |
|
unsigned long long int |
float _Complex |
|
|
double _Complex |
|
|
long double _Complex |
|
|
Typy danych definiowane przez użytkownika | ||
struct |
|
|
union |
|
|
typedef |
|
|
enum |
|
Zależności rozmiaru typów danych są następujące:
- sizeof(cokolwiek) = sizeof(signed cokolwiek) = sizeof(unsigned cokolwiek);
- 1 = sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long);
- sizeof(float) ≤ sizeof(double) ≤ sizeof(long double);
- sizeof(cokolwiek _Complex) = 2 * sizeof(cokolwiek)
- sizeof(void *) = sizeof(char *) ≥ sizeof(cokolwiek *);
- sizeof(cokolwiek *) = sizeof(signed cokolwiek *) = sizeof(unsigned cokolwiek *);
- sizeof(cokolwiek *) = sizeof(const cokolwiek *).
Dodatkowo, jeżeli przez V(typ) oznaczymy liczbę bitów wykorzystywanych w typie to zachodzi:
- 8 ≤ V(char) = V(signed char) = V(unsigned char);
- 16 ≤ V(short) = V(unsigned short);
- 16 ≤ V(int) = V(unsigned int);
- 32 ≤ V(long) = V(unsigned long);
- 64 ≤ V(long long) = V(unsigned long long);
- V(char) ≤ V(short) ≤ V(int) ≤ V(long) ≤ V(long long).
Przypisy
- ↑ Patrz - rozdział Więcej o kompilowaniu.