• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Pytanie dotyczące składni w C++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+2 głosów
278 wizyt
pytanie zadane 17 kwietnia 2024 w C i C++ przez polandonion Dyskutant (7,630 p.)
zamknięte 17 kwietnia 2024 przez polandonion

Witam, mam pytanko dotyczące stosowania przecinka w C++, ale nie jako separator argumentów funkcji. Może podam od razu przykład: w moim programie występuje funkcja

int bin_to_dec(string bin)

Pewnie każdy pisał już coś takiego w swoim życiu, ale tak dla przypomnienia: jest to funkcja zamieniająca liczbę binarną, zapisaną jako tekst, na liczbę w systemie dziesiętnym. I tutaj pojawia się problem, bo w moim kodzie występuje taka pętla:

int bin_to_dec(string bin) {
    int wynik = 0, pot = 1;
    for (int i = bin.size() - 1; i >= 0; i --)
        wynik += (int)((bin[i] != '0') * pot), pot *= 2;
    return wynik;
}

Nauczyciel mówił mi, że ten przecinek w 4. linijce nie determinuje kolejności wykonania operacji, czyli łatwiejszym językiem: powiedział, że te dwie operacje niekoniecznie muszą się wykonać w tej kolejności jak ja to napisałem. Chciałem to sprawdzić i kilkanaście razy odpaliłem program i wszystko działa. Na internecie nie mogłem znaleźć potwierdzenia tezy mojego nauczyciela, a chciałbym zaznaczyć, że kolejność wykonania operacji w tej funkcji jest kluczowa. I tutaj, wreszcie, dobrnąłem do mojego pytania: Czy przecinek w tym przypadku rzeczywiście nie gwarantuje tego, że te dwie operacje wykonają się w kolejności przeze mnie napisanej?

Dziękuję z góry za odpowiedzi i pozdrawiam, Adam :D

komentarz zamknięcia: Pytanie znalazło już odpowiedź
1
komentarz 18 kwietnia 2024 przez Oscar Nałogowiec (29,360 p.)
edycja 18 kwietnia 2024 przez Oscar

Chciałem to sprawdzić i kilkanaście razy odpaliłem program i wszystko działa.

W tego typu wątpliwościach dotyczących kolejności wykonywania operacji chodzi o to, że jeśli nie jest to określone w standardzie to różne kompilatory mogą wykonywać to różnie. Ale raz skompilowany kod będzie już zawsze taki sam - kompilator nie wrzuci tam jakiegoś randoma, by losował kolejność działań. Sprawdzenie "doświadczalne", aczkolwiek i tak niczego nie rozstrzygające, powinno polegać na skompilowaniu i sprawdzeniu różnymi kompilatorami na różnych platformach.

jest to funkcja zamieniająca liczbę binarną, zapisaną jako tekst, na liczbę w systemie dziesiętnym

 

Tak dla formalności - taka funkcja nigdzie nie zamienia na system dziesiętny. Ona bierze postać tekstową liczby w zapisie binarnym i oblicza jej wartość numeryczną. A jak ta wartość jest zapisana w komputerze? Oczywiście najczęściej dwójkowo.

Ona powinna się nazywać bin_2_int.

1 odpowiedź

+3 głosów
odpowiedź 17 kwietnia 2024 przez toko Dyskutant (8,030 p.)
edycja 17 kwietnia 2024 przez toko
 
Najlepsza

Jeżeli poprawnie zrozumiałem problem, chodzi o to, że dodanie do wyniku oraz pomnożenie potęgi mogą być odwrotnie. Według cppreference tak nie jest:

Built-in comma operator

The comma operator expressions have the form

E1 , E2

In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded (although if it has class type, it won't be destroyed until the end of the containing full expression), and its side effects are completed before evaluation of the expression E2 begins [(note that a user-defined operator, cannot guarantee sequencing)(until C++17)].

Zgodnie z tym Twój program wykona się w dobrej kolejności.

komentarz 17 kwietnia 2024 przez polandonion Dyskutant (7,630 p.)
Dzięki za odpowiedź. To było to, czego szukałem

Podobne pytania

+1 głos
1 odpowiedź 1,241 wizyt
pytanie zadane 27 lutego 2022 w C i C++ przez Ciawes Użytkownik (530 p.)
0 głosów
2 odpowiedzi 1,770 wizyt
0 głosów
1 odpowiedź 853 wizyt
pytanie zadane 22 listopada 2019 w Inne języki przez NieMaJuzNazw Użytkownik (890 p.)

93,442 zapytań

142,433 odpowiedzi

322,685 komentarzy

62,804 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...