Jeśli zaczynasz programować od podstaw matematycznych, ten subtelny szczegół może łatwo cię przyłapać.
C++ jest powszechnie używanym językiem programowania, ale także takim, w którym najczęściej występują błędy programistyczne. Wiele z tych błędów wynika z błędów logicznych. W szczególności błędy popełnione podczas operacji porównywania mogą mieć wpływ na dokładność i niezawodność kodu.
Język C++ ma jeden szczególny błąd porównania, który przeocza wielu nowych programistów. Ten błąd wynika z błędnego zrozumienia działania operatorów podczas wykonywania wielokrotnych porównań. Dowiedz się, jak uniknąć tego powszechnego błędu i dlaczego w ogóle się pojawia.
Porównania w C++
Język programowania C++ oferuje wiele różnych funkcji i narzędzi, a także podstawowe operacje, takie jak operatory porównania. Operatory porównania to specjalne operacje w językach programowania, których można używać do porównywania danych między sobą. Programiści dość często używają tych operatorów, zwłaszcza podczas tworzenia algorytmów.
Operatory porównania można zobaczyć w wielu różnych przykładach z życia codziennego. Na przykład, gdy robisz zakupy w sklepie spożywczym, używasz tych operatorów do porównywania cen. Jeśli cena jednego produktu jest niższa niż drugiego, wybierasz ten produkt.
Możesz zobaczyć operatory porównania w instrukcje if-else całkiem często. Operatory porównania to miejsce, w którym można sprawdzić, czy jedna wartość jest większa, mniejsza lub równa innej wartości. Jest bardzo mały, ale ważny szczegół, którego nie należy przeoczyć. Wyniki wyrażeń porównawczych zwracają wartość true lub false, które są wartościami logicznymi. Wartości te są jednym z podstawowych elementów struktury sterowania w programowaniu.
Na przykład w języku programowania C++ „==" Operator sprawdza, czy dwie wartości są równe. Jeśli wartości są równe, wynik zwraca wartość true. W przeciwnym razie wynik będzie fałszywy.
Jeśli (a == b)
{
powrótPRAWDA;
}
w przeciwnym razie
{
powrótFAŁSZ;
}
Przykład problemu porównania
Jednym z typowych błędów popełnianych przez początkujących użytkowników C++ jest używanie operatorów porównania. Operatory te umożliwiają programistom porównywanie dwóch wartości i wykonywanie różnych operacji na podstawie wyniku tego porównania. Jednak nieprawidłowe użycie tych operatorów może spowodować nieoczekiwane błędy.
Na przykład, chociaż wyrażenie 3 < 15 < 10 jest matematycznie niepoprawne, C++ uważa, że jego wynik jest prawdziwy. Możesz to zademonstrować, pisząc następujący prosty program testowy.
Najpierw utwórz plik o nazwie test.cpp. Otwórz ten plik za pomocą swojego ulubiony edytor kodu i dodaj do niego następujący kod.
#włączać
int = 15;intgłówny()
{
Jeśli (3 < a < 10)
{
standardowe::cout << "bla" << standardowe::koniec;
}
w przeciwnym razie
{
standardowe::cout << "gwizd" << standardowe::koniec;
}
powrót0;
}
Możesz użyć tego polecenia, aby skompilować i uruchomić kod:
g++ test.cpp -o Test
Masz teraz program o nazwie Test. Uruchom program i sprawdź jego dane wyjściowe.
C++ uznał 3 < 15 < 10 za prawdziwe podczas uruchamiania tego programu. Dlaczego wynik może wyjść w ten sposób, mimo że jest to matematycznie niepoprawne stwierdzenie?
Przyczyny problemu porównania w C++
Podobnie jak większość języków programowania, C++ czyta kod od lewej do prawej. Każdy operator porównania tworzy wartość logiczną. Wartości logiczne oznaczają nie tylko prawdę i fałsz; mają matematyczny odpowiednik.
Zasada działania A komputer polega na jedynkach i zerach. Dla komputera wynikiem czegoś jest albo prawda, albo fałsz. Programy komputerowe zwykle traktują liczbę 1 jako prawdziwą, a liczbę 0 jako fałszywą.
Ponownie zbadaj problem porównania i przeczytaj stwierdzenie od lewej do prawej; zobaczysz, że istnieją dwa różne porównania. Pierwsze porównanie dotyczy liczb 3 i 15. To jest prawdziwa wartość, ponieważ 3 jest mniejsze niż 15.
Drugie porównanie dotyczy tego wyniku z liczbą 10. Ponieważ musi przeprowadzić porównanie numeryczne, C++ po cichu konwertuje wartość logiczną true na 1. 1 jest mniejsze niż 10, więc ogólny wynik jest prawdziwy.
Podsumowując, chociaż wydaje się to błędem matematycznym, to stwierdzenie jest prawdziwe w przypadku C++ i komputerów.
Jak rozwiązywać problemy z porównaniami w C++
C++, podobnie jak większość innych języków programowania, używa do porównania logicznego innej składni niż tradycyjna matematyka. Wyrażenie matematyczne 3 < a < 15 oznacza, że „3 jest mniejsze niż a I a jest mniejsze niż 15”. Jednak, jak widać, C++ interpretuje to wyrażenie inaczej.
Aby reprezentować i w C++, użyj operatora &&. Następnie możesz łączyć ze sobą wyrażenia boolowskie i budować logikę za pomocą operatorów takich jak && reprezentować I, || reprezentować OR i ! reprezentować NIE. Języki jak Java używa tych samych operatorów logicznych.
Używając poprawnego operatora logicznego, możesz naprawić błąd we wcześniejszym przykładzie:
#włączać
int = 15;intgłówny()
{
Jeśli (3 < a && a < 10)
{
standardowe::cout << "bla" << standardowe::koniec;
}
w przeciwnym razie
{
standardowe::cout << "gwizd" << standardowe::koniec;
}
powrót0;
}
Teraz ten kod sprawdzi, czy wartość a jest większa niż 3 i czy wartość a jest mniejsza niż 10. Skompiluj i uruchom program i obserwuj wynik.
Poprzedni przykład wypisał „foo”, ale teraz program wypisuje „boo” zgodnie z zamierzeniami. Wartość logiczna lewej strony porównania (3 < a) jest prawdziwa. Wartość po prawej stronie (a < 10) jest fałszywa. Od prawda i fałsz jest zawsze FAŁSZ, ogólne wyrażenie ma wartość false, więc ten warunek nie powiedzie się, a funkcja w przeciwnym razie biegi blokowe.
Spróbuj przełączyć AND (&&) operatora do OR (||) i obserwując inny wynik.
Znaczenie kontroli logicznych w C++
Porównania logiczne w C++ wymagają użycia wartości boolowskich i operatorów porównania. Upewnij się, że używasz poprawnych wartości boolowskich i operatorów porównania do kontrolowania działania programów. Wykrycie źle sformułowanych wyrażeń może być trudne, ponieważ C++ często zachowuje się inaczej niż całkowicie zawodzi.
Teraz już wiesz, jak kompilatory ignorują ten problem i traktują każde porównanie jako wartość logiczną podczas czytania od lewej do prawej. Uważaj na ten problem w dowolnym języku, którego używasz, i naucz się rozpoznawać jego skutki, aby być o krok do przodu.