C/Składnia

Z Wikibooks, biblioteki wolnych podręczników.
< C

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

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
  • Służy głównie do przechowywania znaków
  • Od kompilatora zależy czy jest to liczba ze znakiem czy bez; w większości kompilatorów jest liczbą ze znakiem
signed char
signed char
  • Typ char ze znakiem
char
unsigned char
  • Typ char bez znaku
short
  • Występuje, gdy docelowa maszyna wyszczególnia krótki typ danych całkowitych, w przeciwnym wypadku jest tożsamy z typem int
  • Często ma rozmiar jednego słowa maszynowego
short int, signed short, signed short int
unsigned short
  • Liczba typu short bez znaku
  • Podobnie, jak short używana do zredukowania zużycia pamięci przez program
unsigned short int
int
  • Liczba całkowita, odpowiadająca podstawowemu rozmiarowi liczby całkowitej w danym komputerze.
  • Podstawowy typ dla liczb całkowitych
signed int, signed
unsigned
  • Liczba całkowita bez znaku
unsigned int, size_t
long
  • Długa liczba całkowita
long int, signed long, signed long int
unsigned long
  • Długa liczba całkowita bez znaku
unsigned long int
float
  • Podstawowy typ do przechowywania liczb zmiennoprzecinkowych
  • W nowszym standardzie zgodny jest z normą IEEE 754
  • Nie można stosować go z modyfikatorem signed ani unsigned
double
  • Liczba zmiennoprzecinkowa podwójnej precyzji
  • Podobnie jak float nie łączy się z modyfikatorem signed ani unsigned
long double
  • Największa możliwa dokładność liczb zmiennoprzecinkowych
  • Nie łączy się z modyfikatorem signed ani unsigned
Typy danych według normy C99
bool
  • Przechowuje wartości 0 lub 1
long long
  • Nowy typ, umożliwiający obliczeniach na bardzo dużych liczbach całkowitych bez użycia typu float
long long int, signed long long, signed long long int
unsigned long long
  • Długie liczby całkowite bez znaku
unsigned long long int
float _Complex
  • Słuzy do przechowywania liczb zespolonych
double _Complex
  • Słuzy do przechowywania liczb zespolonych
long double _Complex
  • Słuzy do przechowywania liczb zespolonych
Typy danych definiowane przez użytkownika
struct
  • Rozmiar zależy od typów danych, umieszczonych w strukturze plus ewentualne dopełnienie[1]
union
  • Rozmiar typu jest taki jak rozmiar największego pola
typedef
  • Nowo zdefiniowany typ przyjmuje taki sam rozmiar, jak typ macierzysty
enum
  • Zwykle elementy mają taką samą długość, jak typ int.

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

  1. Patrz - rozdział Więcej o kompilowaniu.