programowanie
Karol: programowanie − matematyka
Witam, czy mógłby mi ktoś wyjaśnić na czym polega :
(2 != 0x2 ? 5 : 6 + 1)
oraz 12+ ~0
Nie rozumiem : 0x2 oraz 12 + ~0
z góry serdeczne bóg zapłać!
17 sty 17:37
Draghan: Jeśli to język C/C++/pokrewny, to tego...
0x2 to zapis w szesnastkowym systemie pozycyjnym.

(0x2)
16 = (2)
10
Natomiast ~0 to bitowa negacja zera...
Więcej o operatorze ~ znajdziesz tutaj:
http://guidecpp.cal.pl/cplus,operators-bits .
17 sty 17:53
Draghan: Poprawka, zapomniałem klamerek.

(0x2)
16 = (2)
10
17 sty 17:54
Karol: Dziękuję bardzo

Tak to C
17 sty 17:59
Draghan: W pierwszym przypadku można spokojnie zapisać "normalnie", dziesiętnie.
A żeby zrozumieć ~0, napisz prosty program do tego, żeby Ci to wyświetlił.

Bo wszystko w tym przypadku zależne jest od kompilatora i tego, jaki "w domyśle" typ zmiennej
przypisuje do liczby 0.
Dla signed int = 0 ⇒ ~0 = −1. A np. dla unsigned int
32 = 0 ⇒ ~0 = 4294967295.
17 sty 18:12
Draghan: Ech, znowu te klamerki. −.− Miało być:
unsigned int32
17 sty 18:13
Karol: Dzięki, chyba muszę w domyślę traktować to dla signed int.
Chciałbym się jeszcze zapytać o dwie rzeczy.
Pierwsza : 3 + 4 ? 5 & 6 : 7 <− Co oznacza ten zapis?
Wiem, co robi ? pośiliłem się wikipedia, zanim napisałem − jednak nie rozjasnia mi to sytuacji.
5&6 =4
czyli. 7 ? 4:7 − nie rozumiem.
To pierwsze pytanie.
Drugie, czy ktoś mógłby mi przybliżyć w skrócię zasady, kiedy można zadeklarować zmienną pod
jakąś nazwą?
Z góry bardzo dziękuję
18 sty 10:47
Draghan: Hej, skąd Ty takie przykłady bierzesz?

Ktoś albo gmatwa program, albo sprawdza Twoją
znajomość języka.

Co do działania operatora "&", spójrz na tę stronę, którą Ci podlinkowałem wyżej.

Musisz podać mi kontekst tego, co napisałeś, bo wiele mi to nie mówi. To jest na pewno w
przypisaniu, tak?
Co do deklarowania zmiennych... W czystym C nie pisałem nigdy, ale myślę że bardzo podobnie,
jak w C++. Są tam chyba pewne ograniczenia (wydaje mi się, że np. w for nie można deklarować),
ale ogólna zasada powinna być taka sama.
Najpierw piszesz
typ zmiennej, potem jej
nazwę, opcjonalnie możesz ją
zainicjalizować, potem dajesz albo
przecinek i następną nazwę, albo
średnik,
jeśli to już koniec.
Spójrz na przykłady:
int liczba;
char znak1 = 'a';
unsigned int liczbaDodatnia1, liczbaDodatnia2 = 2,
liczbaDodatnia3;
Nazwa nie może się zaczynać cyfrą i nie może być jednym ze słów kluczowych. I tak wstępnie, to
wystarczy.
18 sty 12:30
Karol: Draghan wielkie dzięki za pomoc, przykłady biorę żywcem z zeszłorocznych kolokwium, które mam
jutro

Przykład który podałem jest z treśći "rozwiąż poniższe wyrażenia"
A co do mojego drugiego pytania, to raczej chodziło mi o to, jaką nazwę mogę użyć, ale twoje
ostatnie zdanie mi wystarczyło

Operatory &, |, ~ − zrozumiałem już.
Dlatego biorąc ten przykład :
3 + 4 ? 5 & 6 : 7
Upraszczam go sobie, zgodnie z obowiązująca kolejnością działań.
7 ? 5 & 6 : 7
5 & 6 = 4
czyli:
7 ? 4 : 7
Czytałem co robi ?, i w tym przykładzie tego nie rozumiem,
bo rozpisując to:
if(7)
{
4
}
else
{
7
}
Jeszcze raz dzięki za pomoc
18 sty 13:12
Draghan: Trochę dziwny przykład.

Ale jak na kolokwium, to rozumiem.

if(7) { 4 }
else { 7}
da Ci "wynik"... 4.

Ponieważ 7 != 0, a 0 jest uznawane za false.
Nie będę się rozpisywał, bo i nie ma po co − wrzucę Ci cytat.

"Kiedy instrukcja warunkowa zwraca prawdę?
Instrukcja warunkowa zwraca prawdę wtedy gdy wartość wyrażenia logicznego, umieszczonego w
nawiasach zaokrąglonych jest prawdziwa. Wartość wyrażenia logicznego jest prawdziwa wtedy, gdy
jest ona różna od zera."
[źródło:
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Instrukcja-warunkowa-if-else/16 ]
18 sty 13:23
Karol: OK, rozumiem.
Dziękuje bardzo
18 sty 15:21
Draghan: Owocnej nauki!
18 sty 15:34
Karol: Dziękuje

Jak mogę mieć jeszcze jedno pytanie to:
int k=1;
#define p 'k'
char y=p;
printf("%c",y−k);
Dlaczego rezultatem tego będzie j?
Z góry (ponownie zresztą) bardzo dziękuję
18 sty 18:37
Draghan: Tutaj musisz znać konwersje typów.
Dodam komentarze, żebyś zrozumiał, co tu zachodzi.
int k=1;
#define p 'k' /* definiujesz stałą preprocesora. Gdziekolwiek użyjesz
p, wstawi się
'k' */
char y=p; /* zmienna znakowa y =
'k' */
printf("%c",y−k); /* a tutaj drukujesz zmienną znakową, która ma wartość
'k' − 1, czyli...
właśnie 'j', bo 'j' ma kod ASCII o jeden mniejszy, niż kod, który ma 'k' */
Pomogłem?
18 sty 18:52
Karol: Dzieki znowu za pomóc.
Tak zrozumiałem, cholerny ASCII

Jeżeli mogę zapytać, to w czym programujesz?
18 sty 18:56
Draghan: Zapytać możesz.

W niczym w sumie.

Hobbystycznie się klepało w C++.
18 sty 19:09
Karol: Ah, rozumiem − myślałem, że studiujesz lub pracujesz jako programista

Jak powiedziałeś, zapytać można, więc jeżeli by Ci się chciało dosłownie z ostatnim problemem
mi pomóc, byłbym przezobowiązany!
int tab [4] [5];
double B[5];
double *p;
int r;
int *w = &r;
___
a) *B = 5.24;
b) w = B;
c) p = B [0];
d) *w = tab [3] [4];
Mam napisać, które "oświadczenia(statements) są poprawne.
Jak Ci się nie chce, to nie ma problemu i tak bardzo mi pomogłeś

Z góry dzięki!
18 sty 19:56
Ada: a)
B jest wskaźnikiem na pierwszy element tablicy. Operator * zastosowany do wskaźnika wydobywa
jego wartość.
Więc instrukcja *B= 5.24 jest równoważna B[0] = 5.24
b) poprawne z powodu tego co wyżej
c) nie poprawne, bo B[0] to wartość pierwszego elementu tablicy B, więc jest typu double.
d) też nie poprawne z tego co wyżej (plus to powinien być wskaźnik do wskaźnika, czyli zadziała
double **w , bo tab jest wskaźnikiem pierwszego elementu tablicy wskaźników)
Najlepiej wklepać kod w kompilator i sprawdzić czy działa

W klasycznym C wszystkie zmienne powinno się deklarować na początku programu przed instrukcjami
i blokami.
18 sty 20:21
Draghan: Chciałem studiować inżynierię oprogramowania, ale uczelnia mnie nie chciała.

Dwukrotnie.

Zdaje mi się, że p = B[0]; nie jest poprawne. Ale to najlepiej napisz sobie program
sprawdzający. Ja spadam do całek.

Powodzenia jutro!
18 sty 20:24
Karol: Dzięki wielkie Ada

Szkoda Draghan, jestem pewny, że byś sobie świetnie poradził − tobie też powodzenia
18 sty 21:04