Cześć i witaj.
W tym wykładzie chcę porozmawiać o kilku operatorach, którzy są trochę dziwni w tym
sensie, że niekoniecznie myślisz, że są operatorami.
Ponieważ wszystkie operatory, których nauczyliśmy się do tej pory, tak naprawdę wskazują, że wiesz,
jak używać symbolu do wykonywania obliczeń na liczbach.
Te operatory w rzeczywistości wyglądają jak funkcje.
Porozmawiajmy więc o rzutowaniu w operatorze sizeof.
Aby najpierw porozmawiać o operatorze rzutowania, muszę
powiedzieć trochę o konwersjach typów, o tym, jak konwertowane są dane.
Dowiedzieliśmy się wszystkiego o typach danych i różnych typach danych.
Ale jeśli faktycznie próbujesz przypisać dane do różnych typów,
w języku programowania c zachodzą pewne niejawne konwersje.
Tak więc konwersja danych między różnymi typami może odbywać się automatycznie
i jest to określane jako niejawna
konwersja przez język lub jawnie przez program przez program lub.
Programista sam programista może coś zrobić.
Mogą używać operatora rzutowania zasadniczo do wykonania konwersji.
Dane, które są konwertowane niejawnie, są naprawdę
ważne, ponieważ musisz to zrozumieć, ponieważ większość programów
C, które zamierzasz opracować, aby je efektywnie opracować, musisz zrozumieć
te zasady tych konwersji.
Ponieważ często będziesz mieć liczby całkowite i zmiennoprzecinkowe, liczby
dziesiętne i liczby całkowite.
I będziesz ich czasem używać, mieszając je czasami.
A kiedy to zrobisz, musisz wiedzieć, w jaki sposób rzeczy się zmieniają.
Teraz powinieneś starać się tego uniknąć, używając operatora rzutowania.
Ale jeśli nie używasz operatora rzutowania, zrozum, co się dzieje.
A co się tutaj dzieje, gdy przypisujesz dane do różnych
typów zmiennoprzecinkowych i podwójnych,
dane albo zostaną obcięte, albo będą promowane.
Są to dwa terminy, które usłyszysz.
Obcięte środki stają się mniej precyzyjne,
a promowane oznacza, że stają się bardziej precyzyjne.
Dlatego staraj się nie mieszać tych typów, ale mogą być przydatne.
Najważniejszą rzeczą do zrozumienia jest to, że wiemy z wcześniejszych wykładów, że c jest bardzo elastyczne.
I to jest świadoma decyzja projektantów języka.
Kiedy chcieli, aby była elastyczna, ale znowu jako kompromis, ponieważ ta
dodatkowa wolność jest ci dana,
możesz ją nadużywać. Dlatego nie
nadużywaj pomysłu mieszania typów.
W miarę możliwości staraj się używać tych samych typów, liczb całkowitych z liczbami całkowitymi, liczb zmiennoprzecinkowych z liczbami zmiennoprzecinkowymi.
Ale jeśli
nie możesz, albo zrozum niejawne konwersje, albo wykonaj
jawne konwersje przy użyciu operatora rzutowania.
Więc znowu, inny problem lub
inna koncepcja, w której c jest elastyczne, ale nie powinieneś tego nadużywać.
Więc za każdym razem, gdy wartość zmiennoprzecinkowa jest przypisana do zmiennej całkowitej
w c, więc masz int x, float y,
x równa się y.
Część dziesiętna liczby zostanie obcięta.
Więc jeśli masz liczbę int x równa się 0, float f
równa się 12. 125 i przypiszesz
f do x, wartość x będzie wynosić 12.
Stracisz tę precyzję. Wartość zostanie obcięta,
ponieważ przypisujesz wartość zmiennoprzecinkową do int. Int tylko wie, jak przechowywać liczbę całkowitą.
Więc jest automatycznie konwertowany przez język programowania, przez kompilator do 12.
Przechowywany będzie tylko import.
Teraz, jeśli przypiszesz zmienną całkowitą do zmiennej zmiennoprzecinkowej, a jest odwrotnie,
nie spowoduje to żadnej zmiany wartości liczby.
Wartość jest konwertowana przez system i przechowywana w zmiennej zmiennoprzecinkowej.
Abyś naprawdę nie musiał się martwić, przypisując go do przepływu.
Jeśli przypiszesz 12 do przepływu, nadal będzie to 12, tylko 12. 0.
Kiedy wykonujesz arytmetykę na liczbach całkowitych, a
więc jest to coś innego niż przypisanie wartości do wartości zmiennoprzecinkowej lub zmiennoprzecinkowej
do int, to wtedy,
gdy masz wyrażenie, robisz dodatkowe odejmowanie, niezależnie od przypadku.
Kiedy wykonujesz odejmowanie lub dodawanie, masz dwa operandy.
Tak więc jeden operator może być int, jeden operand może być zmiennoprzecinkowym.
Musisz wiedzieć, jak to się dzieje nawrócenie.
Jeśli więc masz dwa operandy w wyrażeniu i oba są
liczbami całkowitymi, to każda część dziesiętna wynikająca z operacji dzielenia jest odrzucana.
Więc jeśli tak, jeśli masz liczbę całkowitą x, to jest 20.
Masz liczbę całkowitą y, to jest 12. I dzielisz 20 przez 12.
Nie dostaniesz za coś 1 punktu. Otrzymasz tylko 1.
Odrzuci wszystkie wyniki i umieści je jako nowe, ponieważ znowu int przechowuje tylko liczbę całkowitą.
Więc dwie liczby to liczby całkowite i dzielą.
Nie otrzymasz liczby zmiennoprzecinkowej. Nie otrzymasz liczby dziesiętnej.
Teraz, jeśli jeden operator to int, a drugi to liczba zmiennoprzecinkowa,
operacja zostanie utworzona jako operacja zmiennoprzecinkowa. Więc jeśli masz float f wynosi 20. 0, float a to
10, int, to jeśli zrobisz tam
dzielenie lub 12 Przykro mi, że byłoby bardziej odpowiednie, to
wynikiem będzie liczba zmiennoprzecinkowa, a wynikiem będzie
1 punkt 8888 lub cokolwiek to jest 1 punkt, niezależnie
od przypadku.
Nie przypisujesz tych danych do niczego. To jest wyrażenie, jakie ma zamiar zwrócić.
Więc dwie liczby całkowite w dzieleniu, to będzie liczba całkowita.
Int i double lub float, zawsze będzie to liczba zmiennoprzecinkowa, zawsze będzie
to dziesiętna operacja zmiennoprzecinkowa.
I to jest niejawna konwersja. Właśnie tego potrzebujesz, aby zrozumieć,
co się dzieje i robi program, jeśli nic nie robisz.
Powinieneś jednak spróbować wykonać kilka
jawnych konwersji, które możesz zrobić za pomocą operatora rzutowania.
I to jest po prostu określane jako mniej więcej rzucanie.
Gdy chcesz dokonać konwersji, widzisz przesyłanie w wielu językach.
A wszystko to robisz jawną
konwersję, mówisz, jakie mają być dane.
Więc chcesz to zrobić, jeśli możesz, ponieważ w
przeciwnym razie dane mogą zostać zdegradowane, mogą zostać utracone.
Jeśli zrobisz dwie liczby int i wykonasz dzielenie
i nie są one podzielone równo, stracisz wszystkie te dane.
Możesz więc zażądać dokładnej konwersji typu, której chcesz,
wyraźnie ją określając.
Nazywa się to rzutowaniem i polega na poprzedzeniu
wielkości nazwą żądanego typu w nawiasach.
Tak więc nawiasy i
nazwa typu stanowią operator
WPR.
Robisz lewy nawias, a następnie określasz typ danych, a następnie wpisujesz nawias.
I to przekształci to, co jest po prawej stronie,
jakiekolwiek wyrażenie jest po prawej stronie lub nawet jeśli jest to tylko pojedyncza zmienna,
zamieni to na to, co kiedykolwiek znajduje się w nawiasach.
Tak więc pożądany jest rzeczywisty typ, taki jak long, jest on zastępowany przez ten typ słowa.
Tak więc operator przekazany typu ma wyższy priorytet niż wszystkie operatory arytmetyczne z wyjątkiem unitarnego
minus i jedności plus. Nie dowiedzieliśmy się jeszcze o pierwszeństwie.
Będziemy w następnym wykładzie. Pierwszeństwo to w zasadzie
to, co się dzieje, kolejność wykonywanych operacji.
Podamy więc kilka przykładów. W tym miejscu musisz tylko zrozumieć, że operator
rzutowania typu ma pierwszeństwo przed wszystkimi innymi operatorami, z wyjątkiem dwóch jednoargumentowych minus i jednoargumentowego plusa.
Oto przykład, mamy liczbę 21. 51 i mamy operator
rzutowania, ponieważ wiemy, że jest to operator rzutowania, ponieważ znajduje
się w nawiasach i ma typ. Zasadniczo mówimy, że weź
21. 51 przekonwertuj go na int.
Jeśli weźmiesz liczbę zmiennoprzecinkową przekonwertowaną na nią,
stanie się ona po prostu int, liczbą całkowitą, 21.
To samo, co robi po prawej stronie, konwertuje 26. 99 do wew.
Więc co właściwie by się tutaj stało, gdybyś zrobił to wyrażenie w instrukcji,
dałoby to 21 plus 26. Obciąłby dane z
0. 51 do liczby całkowitej i to samo co 0. 99.
A więc to jest operator rzutowania, wszystko w nawiasach, które zawiera typ danych.
Często to zobaczysz.
Gdybyś miał powiedzieć 21 plus 26 i rzucić to na pływaki, po
prostu dodałby kropkę 0.
Zwykle nie rzucasz na bardziej precyzyjny typ, ponieważ nie
będziesz bardziej precyzyjny.
Rzucasz od bardziej precyzyjnych czcionek do mniej precyzyjnych.
Więc bardziej jak float do int.
Widzisz to od czasu do czasu w niektórych programach,
gdy używasz różnych typów. Powinieneś unikać używania różnych typów,
jeśli wykonujesz arytmetykę. Ale jeśli to zrobisz, zobaczysz to.
Wielkość operatora, inny operator, który jest trochę dziwny,
nie podobny do wielu innych. A to faktycznie wygląda jak funkcja.
Ale sizeof jest operatorem. Wykonuje akcję.
Nie robi niczego zorientowanego na funkcje.
To, co robi, mówi ci, ile bajtów zajmuje w
pamięci dany typ. Więc wygląda jak funkcja, ponieważ przyjmuje argument.
Podamy przykład ale zwróci tylko liczbę bajtów w pamięci. Pamiętaj, że w
zależności od używanego systemu, używanej
platformy, systemu operacyjnego, architektury komputera, sprzętu, różnych
typów danych będą reprezentowane pamięci o różnych rozmiarach.
Na przykład int może mieć 4 bajty w 1 systemie 8 w innym.
Możesz więc użyć operatora sizeof jako specjalnego słowa kluczowego operatora w c i możesz
przekazać typ danych, który powie Ci, ile bajtów używa w pamięci.
Więc sizeof jest w rzeczywistości operatorem, a nie funkcją.
Jest oceniany w czasie kompilacji, a nie w czasie wykonywania, chyba że w jej argumencie jest używana tablica o zmiennej długości.
A więc o tym wspomnimy. Zasadniczo oznacza to, że jeśli masz zmienną,
która znajduje się w rozmiarze tablicy,
nie zostanie ona rozwiązana w czasie kompilacji w czasie wykonywania, więc nie jest
to ważne, aby wiedzieć.
Argumentem operatora sizeof może być zmienna, nazwa tablicy,
nazwa podstawowego typu danych, np.
Int float, nazwa pochodnego typu danych cokolwiek lub wyrażenie.
Więc możesz powiedzieć sizeof x plus y.
I to po prostu powiemy rozmiar x
plus rozmiar y lub wynikowe liczby. Jeśli x jest int, y jest int i ma rozmiar 16,
to powiedziałoby, że to cal 4 bajty.
Gdyby int jeden był zmiennoprzecinkowym, a wynik byłby arytmetyką zmiennoprzecinkową, to byłoby to
8 bajtów lub coś w tym rodzaju.
Ale możesz go używać do wielu rzeczy i powinieneś go używać do wielu rzeczy. Na przykład Sizeof int
zwróci liczbę bajtów zajmowanych przez zmienną typu int.
Więc to zwróci 4 lub 8 w zależności od twojego systemu.
Możesz również zastosować operator sizeof do wyrażenia, jak wspomniałem,
wynikiem jest rozmiar wartości.
Wynika to z wyrażenia obszaru. Więc jeśli dwa int razem, nadal będą int.
Więc nadal będzie to rozmiar. Ale zobaczysz, że operator sizeof jest również używany, gdy mówimy o wskaźnikach.
Chciałem o tym teraz porozmawiać, ponieważ jest to operator.
Ale zamierzamy podać o wiele więcej przykładów tego i rzucanie w całej klasie, gdy będziemy
mówić o większej liczbie pojęć.
W szczególności operator sizeof odgrywa znacznie większą
rolę, gdy mówimy o
wskaźnikach, ponieważ obliczając, ile pamięci do alokacji, czyli jakie są wskaźniki,
używasz sizeof, ponieważ chcesz być dokładny.
Ale możesz go również użyć do innych rzeczy.
Dlatego używaj operatora sizeof, gdy tylko jest to możliwe, aby uniknąć obliczania rozmiarów
kodu w programie.
Twarde rozmiary kodu magiczne liczby nie są dobrą rzeczą, ponieważ znowu, jeśli jesteś
w innym systemie, jeśli chcesz zakodować na stałe system 4 na
1 dla int, w innym systemie może być 8, więc użyj rozmiaru
tak często, jak możesz, a zobaczymy, że staje się to znacznie bardziej
wiarygodne, kiedy mówimy o wskazówkach.
Inne nieco
dziwne operatory to operator gwiazdki.
Być może powiedziałeś sobie gwiazdkę, rozmawialiśmy już o tym w mnożeniu.
Ale ta gwiazdka zajmuje dwa operandy, jeden po lewej stronie po prawej.
Jeśli zastosujesz operator gwiazdki do zmiennej i
powiesz po prostu gwiazdkę nazwa zmiennej z tylko jednym argumentem po prawej
stronie, oznacza to coś innego. W rzeczywistości reprezentuje wskaźnik.
To wyłuskiwanie wskaźnika.
I znowu, nie zamierzam teraz się nad tym zastanawiać, ponieważ przejdziemy przez
to, kiedy będziemy mówić o wskazówkach.
Ale jeśli zobaczysz coś takiego jak gwiazda a, nie przejmuj się, że to rzeczywiście ważne.
To robi gwiazdkę, operator wskaźnika.
Możesz również zobaczyć dwukropek ze znakiem zapytania.
To jest operator używany do podejmowania decyzji.
Jeśli warunek jest prawdziwy, jeśli rzecz po lewej jest prawdziwa, obliczana
jest wartość po prawej stronie po dwukropku i tak dalej.
Jest to skrótowa notacja dla instrukcji if-else.
Nazywa się to operatorem trójskładnikowym. Ale znowu, nie chcę teraz
omawiać ich szczegółowo, ponieważ będziemy
o nich rozmawiać, kiedy będziemy rozmawiać o naszych
konkretnych tematach.
Porozmawiamy o operatorze zwrotnym, gdy mówimy o oświadczeniach decyzyjnych. Będziemy mówić o
jednoargumentowym operatorze gwiazdki, gdy mówimy o wskaźnikach.
Ale jeśli widzisz to teraz, a chciałem o tym teraz wspomnieć, ponieważ są oni technicznie operatorami, ale
zrozumiemy ich przypadki użycia, gdy będziemy mówić o tych koncepcjach. Dziękuję Ci.