Język C. Kierunek: Informatyka Stosowana (Wydział FAIS UJ) Wykład: Wtorek, s. A Forma zaliczenia kursu: Egzamin pisemny (test wyboru) * **

Podobne dokumenty
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Zmienne, stałe i operatory

1 Podstawy c++ w pigułce.

Język C zajęcia nr 11. Funkcje

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania skrót z wykładów:

1 Podstawy c++ w pigułce.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania w języku C i C++

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Wstęp do programowania

Języki i metodyka programowania. Wprowadzenie do języka C

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Podstawy Programowania Podstawowa składnia języka C++

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Część 4 życie programu

Język ludzki kod maszynowy

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Wstęp do wskaźników w języku ANSI C

Programowanie strukturalne i obiektowe

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie Komputerów

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Wstęp do Programowania, laboratorium 02

Język C - podstawowe informacje

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Tablice, funkcje - wprowadzenie

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie komputerowe. Zajęcia 1

MATERIAŁY DO ZAJĘĆ II

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:

Argumenty wywołania programu, operacje na plikach

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Proces tworzenia programu:

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

C++ wprowadzanie zmiennych

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Podział programu na moduły

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Program w C. wer. 12 z drobnymi modyfikacjami! Wojciech Myszka :59:

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

dr inż. Jarosław Forenc

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Struktury, unie, formatowanie, wskaźniki

Mikrokontroler ATmega32. Język symboliczny

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

I - Microsoft Visual Studio C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Wskaźniki. Informatyka

Lab 9 Podstawy Programowania

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Termin Egzaminu (Język C): !!! >> CZWARTEK, 7 LUTEGO << GODZ

Podstawy Programowania C++

Funkcja (podprogram) void

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Tablice deklaracja, reprezentacja wewnętrzna

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

IX. Wskaźniki.(3 godz.)

Proste algorytmy w języku C

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Struktury Struktura polami struct struct struct struct

Biblioteka standardowa - operacje wejścia/wyjścia

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Programowanie obiektowe

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Transkrypt:

Język C Kierunek: Informatyka Stosowana (Wydział FAIS UJ) Wykład: Wtorek, 12.15 s. A-1-06 Forma zaliczenia kursu: Egzamin pisemny (test wyboru) * ** * Warunkiem przystąpienia do egzaminu jest wcześniejsze zaliczenie ćwiczeń (lub w uzasadnionych przypadkach: zgoda prowadzącego ćwiczenia) ** Ocena 5.0 (bdb) z ćwiczeń zwalnia z pisemnej części egzaminu Adam Rycerz [ wyklad02.pdf ] Strona 1 z 33

Po co uczyć się języka C? https://lifehacker.com/the-case-for-learning-c-as-your-firstprogramming-langu-1682070792 Adam Rycerz [ wyklad02.pdf ] Strona 2 z 33

http://www.iaeng.org/ijcs/issues_v32/issue_4/ijcs_32_4_19.pdf Adam Rycerz [ wyklad02.pdf ] Strona 3 z 33

Poprzedni wykład: krótkie przypomnienie - Komputer to maszyna cyfrowa ( => zasady programisty ) - Reprezentacja liczb w maszynie ( będzie ERRATA ) - Krótka charakterystyka języka C - Jednostki leksykalne języka C Adam Rycerz [ wyklad02.pdf ] Strona 4 z 33

ERRATA: typy liczbowe w języku C: Całkowite: char 1 bajt/8 bitów, zakres: 0 2 8-1=255 (jeśli unsigned**; signed: -128 127) int co najmniej* 2 bajty/16 bitów; zakres: 0 2 16-1=65635 (unsigned) -32768 32767 (signed) *) Zwykle typ int odzwierciedla romiar l.całkowitej wynikający z architektury maszyny, współcześnie: 32 lub 64 bajty. **)Przykładowa pełna deklaracja zmiennej: unsigned int i; stałe zapisujemy np. 77 (jeśli int), 77u lub 77U (jeśli unsigned) Adam Rycerz [ wyklad02.pdf ] Strona 5 z 33

UWAGI o typie char: - Standard ANSI C nie określa, czy char ma znak czy nie. - Jest jednak pewne, że znaki klawiaturowe będą reprezentowane przez liczby nieujemne - Jeśli nasza zmienna typu char ma przechowywać coś innego niż znaki, deklarujemy ją jawnie jako signed char ALBO jako unsigned char. ( Albo po prostu jako int ) Przyporządkowanie wartości całkowitych znakom daje ciekawe możliwości, np. instrukcja: if ( s>= 0 && s<= 9 ) d = s - 0 ; przetwarza cyfrę/znak ( char s ) na cyfrę/liczbę ( int d ). ( Warunek powyżej odpowiada: isdigit(s) z biblioteki <ctype.h> ). Adam Rycerz [ wyklad02.pdf ] Strona 6 z 33

Typy zmiennopozycyjne: float pojedynczej precyzji, 32 bity (co najmniej!), ~7 cyfr, zakres: -3.4x10 38-3.4x10-38, 0, 3.4x10-38 3.4x10 38 double podwójnej precyzji, 64 bity (co najmniej!), ~15 cyfr, zakres: -1.7x10 308-1.7x10-308, 0, 1.7x10-308 1.7x10 308 ( Maksymalne/minimalne wartości zdefiniowane w <limits.h> Poszczególne implementacje często uzupełniają typy zmiennopozycyjne o użyteczne stałe, np. Inf -Inf NaN - not a number ) Kwalifikatory short (krótki) oraz long (długi) modyfukują typy podstawowe, np. deklaracja: long int i; wymusza 32 bity. ( W tym przypadku słowo int może zostać pominięte; ale np. long double już nie można skrócić ) Adam Rycerz [ wyklad02.pdf ] Strona 7 z 33

6 jednostek leksykalnych języka C 1) słowa kluczowe: int, goto, if, else, 2) stałe: 0xF85 2.17e+10 a 7 3) łańcuchy znaków: Tekst <=> tablicy: { T, e, k, s, t, \0 4) identyfikatory: A-Z, a-z, 0-9 ( pierwszy znak: zawsze litera lub _ ) 5) operatory: = + * += &&,?: 6) separatory: ( ) [ ] { } ; Adam Rycerz [ wyklad02.pdf ] Strona 8 z 33

Stałe - W języku stałe mają swoje typy; - Typu stałej nie deklarujemy jawnie, jest dedukowany przed kompilator na podstawie samego zapisu (!) ( 123 - int, 123l lub 123L - long, 123ul lub 123UL - unsigned long, 7.0 - double, 7.0f lub 7.0F - float, 7.0l lub 7.0L - long double ) - Stałe napisowe ( Napis ) mają specjalne prawa, nie można ich np. porównać ze sobą operatorami: == lub!= => Zapis 7 oznacza stałą znakową (char), zaś zapis 7 stałą napisową, równoważną tablicy znaków { 7, \0 }. ( Element \0 to tzw. znak pusty, oznaczający koniec napisu. ) Adam Rycerz [ wyklad02.pdf ] Strona 9 z 33

PRZYKŁAD: Obliczamy długość napisu w tablicy s int strlen(char s[]) /* Może być też: strlen(const char s[]) (!) */ { int i; } i=0; while (s[i]!= \0 ) i++; return i; Adam Rycerz [ wyklad02.pdf ] Strona 10 z 33

Znaki specjalne w C Ale już np. znak końca pliku (ang. end-of-file) EOF jest zdefiniowany jako stała (typu int) w nagłówku <stdio.h>. (Pisząc na standardowe wejście, można wprowadzić EOF używając kombinacji klawiszy CTRL-D.) Adam Rycerz [ wyklad02.pdf ] Strona 11 z 33

Wyrażenia stałe Wartości wyrażeń stałych (tj. wyrażeń, w których występują wyłącznie stałe) są obliczane na etapie kompilacji programu, wynik trafia do kodu maszynowego. Np. w deklaracji tablicy: double x[1977-25+1]; /* pomiędzy nawiasami [ ] mamy wyr. stałe */ Ciekawą możliwością jest dodawanie napisów. Deklaracja: char TSEliot[]= Pomiędzy ideę\n I rzeczywistość\n Pomiędzy zamiar\n I dokonanie\n Pada Cień\n ; poprawnie zainicjuje tablicę znakową. Adam Rycerz [ wyklad02.pdf ] Strona 12 z 33

Makra czy kwalifikator const? (cz.1) Stałe w C to elementy jak: 123 123UL itp. Makrodefinicje: #define NMAX 100 #define ALPH 0.7L to nie definicje stałych a raczej definicje nazw/symboli (NMAX oraz ALPH), które kompilator podmieni na stałe (100 oraz 0.7L). Z kolei deklaracja: const int nmax = 100; nie definiuje stałej, lecz raczej zmienną, której wartość nie może ulec zmianie. (Ma ona np. swój adres, dostępny jako &nmax). (Zwyczajowo, makra nazywamy używając wielkich liter, zmienne - małych.) Adam Rycerz [ wyklad02.pdf ] Strona 13 z 33

Makra czy kwalifikator const? (cz.2) A czy można zdefiniować: #define NMAX1 NMAX+1 Jak najbardziej, ale wówczas np. wyrażenie 2*NMAX1 zostanie zastąpione przez 2*100+1 [ ==201 ], a poeta prawdopodobnie miał na myśli: 2*(100+1) [ ==202 ] (!). Jak uzyskać porządany efekt? Stosuj nawiasy (!), tutaj: #define NMAX1 (NMAX+1) Za dużo nawiasów nie przeszkadza, za mało nawiasów - nie pomaga. Inny sposób: const int nmax1=nmax+1; i już ból głowy przechodzi Adam Rycerz [ wyklad02.pdf ] Strona 14 z 33

Makra czy kwalifikator const? (cz.3) Podsumowanie: - Makra ( #define ) to potężne narzędzie, jednak ich niefortunne definicje często prowadzą do trudnych do wykrycia błędów. ( => nawiasy pomagają!!! ) - Makrami można niekiedy zastąpić fukcje, np.: #define SQR(x) ((x)*(x)) #define MAX(a,b) (((a)>(b))?(a):(b)) - W przypadku użycia słowa kluczowego const do tzw. deklaracji stałych, czas wykonania programu może być nieco dłuższy (odwołanie do adresu, odczyt komórki pamięci), jednak w praktyce dzisiaj już nie warto się tym przejmować ( => niech się komputer męczy, nie ja! ) Adam Rycerz [ wyklad02.pdf ] Strona 15 z 33

Typ i stałe wyliczeniowe (enum) Skończony ciąg stałych można zdefiniować deklaracją: enum months { JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC } Wówczas, mamy: JAN==1, FEB==2,, DEC==12. Wartości w jednym wyliczeniu mogą się powtarzać; jeśli nie zdefiniujemy pierwszej - domyślnie przyjmowane jest 0. Dodatkowo, pojawia się pełnoprawny typ danych: enum months. Adam Rycerz [ wyklad02.pdf ] Strona 16 z 33

#include<stdio.h> enum week{mon=1, Tue, Wed, Thu, Fri, Sat, Sun}; int main() { enum week day; /* To zmienna typu enum week */ day = Wed; printf( %d\n",day); /* Wypisuje: 3 */ return 0; } [ https://www.geeksforgeeks.org/enumeration-enum-c/, zmiany: AR] Adam Rycerz [ wyklad02.pdf ] Strona 17 z 33

Te same stałe całkowite można zdefinować też np. tak: enum week{sat=6, Sun, Mon=1, Tue, Wed, Thu, Fri}; wówczas także dostajemy Mon=1, Tue=2,, Sun=7 (!) Uwaga praktyczna: W programach kalendarzowych często zachodzie potrzeba drukowania / odczytu nazw dni tygodnia lub miesięcy jako napisów ( Jan, Tue itp.) przy zachowaniu ich logicznego związku ( przyporządkowania ) z odp. liczbami. W takim wypadku - używamy struktur ( i tablic struktur ) ( Zmienne typu wyliczeniowego - raczej żadko używane. ) Adam Rycerz [ wyklad02.pdf ] Strona 18 z 33

Deklaracje Co do zasady, w C każda zmienna musi być zadeklarowana przed pierwszym użyciem [ często jednak możliwa deklaracja niejawna przez kontekst ]. Przykładowo, deklaracje: oraz int i,j,k; int i; int j; int k; są równoważne. => A po co komu drugi sposób? >> Ponieważ zostaje więcej miejsca na komentarze! << Adam Rycerz [ wyklad02.pdf ] Strona 19 z 33

W deklaracjach można od razu nadawać zmiennym wartości początkowe, np: double eps=1.0e-6; po prawej stronie operatora przypisania (=) musi znajdować się ( co do zasady ) stała lub wyrażenie stałe ( już dzisiaj było ). Ważny wyjątek stanowią tzw. zmienne automatyczne, tj. zmienne lokalne funkcji, które pojawiają się i znikają za każdym wywołaniem funkcji. Takie zmienne można inicjować dowolnym wyrażeniem ( np: int i=a+b; float z=sqrt(7.0f); itp. ). Jeśli zmienna automatyczna niezainicjowana - przyjmuje wartość przypadkową (potocznie: przechowuje śmieci ). Adam Rycerz [ wyklad02.pdf ] Strona 20 z 33

Zasięg zmiennych: Zmienne lokalne widoczne są wewnątrz bloku ( { } ), w którym zostały zadeklarowane (także w blokach w nim zagnieżdżonych). Zmienne zewnętrzne (deklarowane poza wszystkimi blokami) - istnieją cały czas; jeśli niezainicjowane - podstawiane zera. Deklaracja (a właściwie: definicja) zmiennej lokalnej zakrywa zmienną zewnętrzną (lub lokalną z bloku wyżej) o tej samej nazwie. Każdą zmienną w języku C można zadeklarować wielokrotnie, ale tylko raz zdefiniować. CO TO ZNACZY???? Adam Rycerz [ wyklad02.pdf ] Strona 21 z 33

Kwalifikator extern: Przykład #include <stdio.h> int j=1; /* Definicja zmiennej zewn. */ int main() { extern int j; /*Ponowna deklaracja, tutaj*/ /* nie wolno przypisać wartości (!) */ } printf( %d\n",j); /* wypisuje: 1 */ return 0; Adam Rycerz [ wyklad02.pdf ] Strona 22 z 33

A jeśli pominiemy extern? #include <stdio.h> int j=1; /* Definicja zmiennej zewn. */ int main() { printf( %d\n",j); /* TEŻ DOBRZE! */ return 0; } W tym przykładzie mamy tzw. deklaracje niejawną (przez kontekst) Adam Rycerz [ wyklad02.pdf ] Strona 23 z 33

A gdyby tak nigdy nie używać extern? #include <stdio.h> int j=1; /* Definicja zmiennej zewn. */ /* TUTAJ DUZO INNYCH DEFINICJI */ int main() { int j; /* przypadkowo się-napisało */ /* */ printf( %d\n",j); /* wypisuje śmieci! */ return 0; } Adam Rycerz [ wyklad02.pdf ] Strona 24 z 33

- Zmiennych zewnętrznych nie należy nadużywać! - Przydają się np. wtedy, gdy wiele funkcji programu działa na tych samych danych ( a listy parametrów funkcji rosną i rosną ). - Najlepiej nadawać im unikalne ( tj. długie! ) nazwy, aby przypadkowo nie zostały zakryte przez zmienne lokalne. - W dłuższych programach - zmienne zewnętrzne warto redeklarować z kwalifikatorem extern (wówczas deklaracja innej zmiennej lokalnej o t.samej nazwie spowoduje błąd kompilacji ) Kwalifikator static: Zmienna lokalna poprzedzona static zachowuje się ( prawie ) jak zewnętrzna, tzn. pamięta wartość pomiędzy wywołaniami funkcji, ( choć oczywiście nie jest widoczna poza swoim blokiem { } ). Adam Rycerz [ wyklad02.pdf ] Strona 25 z 33

Jeśli zmienna zewnętrzna jest zadeklarowana jako static, będzie widoczna wyłącznie w swoim PLIKU (ale można ją redeklarować w innym pliku za pomocą extern ). ŁĄCZNIE: - W małym programie ( zwłaszcza jednoplikowym ) w zasadzie możemy zapomnieć o kwalifikatorach extern i static: kiedy potrzeba, aby zmienna pamiętała swoją wartość, definiujemy ją jako zewnętrzną (tzn. poza wszystkimi blokami ), a później używamy przez kontekst ( pamiętając, aby nie zakryć nazwy! ) W pozostałych przypadkach - używamy zmiennych automatycznych. - A kiedy mały program urośnie => extern + static Adam Rycerz [ wyklad02.pdf ] Strona 26 z 33

Przykład podsumowujący elementarz zmiennych: #include <stdio.h> #include <math.h> int j=2; /* double x=sqrt(1.0*j); >> TUTAJ NIE WOLNO! << */ int main() { extern int j; /* Tutaj nie piszemy j=2 */ int k; double x=sqrt(1.0*j); /* >> A TUTAJ JUŻ WOLNO << */ } printf( %d\n",j); /* Wypisuje 2 */ printf( %d\n",k); /* Wypisuje śmieci */ printf( %f\n",x); /* Wypisuje 1.414214 */ return 0; Adam Rycerz [ wyklad02.pdf ] Strona 27 z 33

Operatory - proste przykłady Przypisanie (podstawienie), dodawanie i mnożenie: int a,b,c; /* oraz operator przecinkowy */ a=8; a=a+1; /* Wersja skrócona: a+=1; */ a=a*a; /* <=> a*=a; */ /* */ c=2*(b=a=a+7); /* Czytamy OD PRAWEJ! */ Adam Rycerz [ wyklad02.pdf ] Strona 28 z 33

Priorytety i łączność operatorów w C Adam Rycerz [ wyklad02.pdf ] Strona 29 z 33

Operatory arytmetyczne W C mamy dwuargumentowe operatory arytmetyczne: + - * / oraz dzielenie modulo (%) wyłącznie dla typów całkowitych. Na przykład, wyrażenie: (( y%4 == 0 && y%100!= 0 ) y%400 == 0) przyjmuje wartość 1 jeśli y to rok przestępny (w kalendarzu gregoriańskim) albo 0 jeśli nie. Dla liczb ujemnych - wynik dzielenia modulo (%) może zależeć od maszyny; podobnie jest z dzieleniem całkowitym ( / ). Adam Rycerz [ wyklad02.pdf ] Strona 30 z 33

Relacje i operatory logiczne Operatory relacji: Operatory porównania: > >= < <= ==!= Wszystkie mają niższy priorytet niż operatory arytmetyczne, a zatem wyrażenia: i<lim-1 oraz i<(lim-1) są równoważne. Operatory logiczne to: && ( i lub ); oraz negacja:! Wyrażenia zawierające operatory logiczne obliczane są od lewej do prawej, ale tylko do momentu, gdy wynik jest już jednoznaczny (!) for (i=0; i<lim-1&&(c=getchar())!= \n ; i++) s[i]=c; => dla i==lim-1 znak już nie będzie wczytany. Adam Rycerz [ wyklad02.pdf ] Strona 31 z 33

Interpretacje logiczna liczb całkowitych Jeśli x jest typu int, warunek if(x) będzie interpretowany jako: PRAWDZIWY, dla dowolnego x!= 0 FAŁSZYWY, wyłącznie dla x == 0. Jeśli z kolei zmiennej całkowitej przypisujemy wartość wyrażenia logicznego, np. x = (a>b); wynik będzie równy 1 (zawsze 1), jeśli wyrażenie po prawej stronie okazało się PRAWDZIWE, albo 0, jeśli okazało się FAŁSZYWE. Konsekwentnie, logiczna negacja (!x) daje 0 dla dowolnego x!= 0, albo 1 wyłącznie dla x == 0. Np. warunek na rok przestępny można przepisać np. tak: if((!(y%4) && y%100 )!(y%400)) Adam Rycerz [ wyklad02.pdf ] Strona 32 z 33

Przekształcenia typów Jeśli argumenty operatora są różnych typów, dokonuje się przekształcenia typu ciaśniejszego do obszerniejszego (ale tylko w ramach jednego wyrażenie składowego ) Na przykład, dodawanie: 1.0f + 1 da wynik float, ale już podstawienie: y = (1/3)*x*x; gdzie x - float (lub double) okazuje się równoważne y=0.0f (lub y=0.0) Dzieje się tak, ponieważ (1/3) jest najpierw obliczane jako int, a dopiero później przekształcane na float (lub double). A wystarczyło napisać: 1.0/3 Zaskakiwać mogą też porównania z argumentami różnych typów, np. prawdziwe okazuje się: -1L < 1U jak również: -1L > 1UL (!!! ) Adam Rycerz [ wyklad02.pdf ] Strona 33 z 33