Wyrażenia logiczne - problem ze zrozumieniem

0

Witam,

Czy ktoś mógłby wytłumaczyć mi łopatologicznie jak poniższe wyrażenia są interpretowane przez kompilator? Bo niestety mam wrażenie, że utknąłem i "błądze"

unsigned char wyswietlacz[4] = {0,1,2,3};
unsigned char seg=0, segmask=0
 ...
P1 = P1&0xFC;  
...
seg=++seg&3; segmask=3<<seg;
P1=(P1&0xc0)|0x3c|seg;
 PTSEG=Tab7s[wyswietlacz[3-seg]];
2
seg=++seg&3;

To to jest UB. edit: jednak nie do końca. W C jest to UB, w C++98/03 też, w 11/14 chyba nie, w 17 na pewno nie.

Reszta to łopatologiczne użycie zgodne z dokumentacją.

1

Do tego tablica wyswietlacz nie ma żadnego sensu. Równie dobrze ta linijka:

PTSEG = Tab7s[wyswietlacz[3 - seg]];

mogłaby wyglądać tak:

PTSEG = Tab7s[3 - seg];

Krócej, czytelniej.

0
kq napisał(a):
seg=++seg&3;

To to jest UB.

W takim razie dałoby się to rozpisać jakoś "inaczej"/"czytelniej"?

furious programming napisał(a):

Do tego tablica wyswietlacz nie ma żadnego sensu. Równie dobrze ta linijka:

PTSEG = Tab7s[wyswietlacz[3 - seg]];

mogłaby wyglądać tak:

PTSEG = Tab7s[3 - seg];

Krócej, czytelniej.

w kontekście fragmentu, który wstawiłem, faktycznie może nie mieć, ale w kontekście całego programu ma znaczenie. Zmiana na zapis, PTSEG = Tab7s[ 3 - seg]; powoduje, że program przestaje prawidłowo realizować zadanie niesetty

0
wld1337 napisał(a):

W takim razie dałoby się to rozpisać jakoś "inaczej"/"czytelniej"?

Rozbić to na dwie operacje – najpierw inkrementacja, a następnie koniunkcja.

w kontekście fragmentu, który wstawiłem, faktycznie może nie mieć, ale w kontekście całego programu ma znaczenie.

Ta tablica przechowuje swoje własne indeksy, dlatego jej użycie jest zbędne. Każdy wyliczony indeks sam w sobie daje Ci taką samą wartość, jaka znajduje się w tablicy pod tym indeksem.

W skrócie, indeks == wyswietlacz[indeks].

0

w kontekście fragmentu, który wstawiłem, faktycznie może nie mieć, ale w kontekście całego programu ma znaczenie.

Ta tablica przechowuje swoje własne indeksy, dlatego jej użycie jest zbędne.

W takim razie chyba czegoś nie rozumiem... Zmieniłem to na taki zapis jaki został przez Ciebie zaproponowany i efekt nie był taki sam jak wcześniej.

0

Widać typ danych tej tablicy ma jakieś znaczenie. Póki co może zostać, skoro twierdzisz, że bez niej nie działa.

Co do tego kawałka z UB – możesz to zapisać tak:

++seg;
seg &= 3;

albo tak:

seg += 1;
seg &= 3;

Jak wolisz.

0

Dziękuje Wam za bardzo szybką odpowiedź (jak zawsze) postaram się to przeanalizować na spokojnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1