Rozważmy sytuację, w której idziesz na rynek, a współlokator mówi Ci: „Jeśli mają truskawki w promocji, kup je”. Jest to instrukcja warunkowa, co oznacza, że wykonasz jakąś akcję („kup trochę”) tylko wtedy, gdy warunek („mają truskawki w sprzedaży”) jest prawdziwy.
Takie warunki są powszechne w programowaniu, ponieważ pozwalają nam zaimplementować zachowanie warunkowe w naszych programach. Najprostszy rodzaj instrukcji warunkowej w C++ nazywa się instrukcji if. An instrukcji if pozwala nam wykonać jedną (lub więcej) linijkę kodu tylko wtedy, gdy jakiś warunek jest spełniony.
Najprostsza instrukcji if przybiera następującą formę:
if (condition) true_statement;
Dla czytelności jest ona częściej zapisywana jako następujący:
if (condition)
true_statement;
A warunek (zwana także wyrażenie warunkowe) to wyrażenie, którego wynikiem jest wartość logiczna.
Jeśli warunek instrukcji instrukcji if określany jako wartość logiczna prawda, wówczas true_statement jest wykonywane. Jeśli warunek zamiast tego daje wartość logiczną fałsz, wówczas true_statement jest pomijany.
Przykładowy program używający instrukcji if
Biorąc pod uwagę następujący program:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
return 0;
}Oto wynik jednego uruchomienia tego program:
Enter an integer: 0 The value is zero
Przyjrzyjmy się, jak to działa bardziej szczegółowo.
Najpierw użytkownik wprowadza liczbę całkowitą. Następnie oceniany jest warunek x == 0 . Operator równości (==) służy do sprawdzania, czy dwie wartości są równe. Operator== zwraca prawda jeśli argumenty są równe i fałsz jeśli nie są. Ponieważ x ma wartość 0 i 0 == 0 jest prawdą, to wyrażenie daje prawda.
Ponieważ warunek osiągnął prawda, wykonywana jest kolejna instrukcja, która drukuje Wartość wynosi zero.
Oto kolejne uruchomienie tego programu:
Enter an integer: 5
W tym przypadku x == 0 wyniesie fałsz. Kolejna instrukcja jest pomijana, program kończy się i nic więcej nie jest wypisywane.
Ostrzeżenie
Instrukcje if Warunkowo wykonaj tylko pojedynczą instrukcję. Na lekcji mówimy o tym, jak warunkowo wykonywać wiele instrukcji 8.2 -- Instrukcje i bloki if.
If-else
Biorąc pod uwagę powyższy przykład, co by było, gdybyśmy chcieli powiedzieć użytkownikowi, że wprowadzona przez niego liczba jest różna od zera?
Moglibyśmy napisać coś takiego:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
if (x != 0)
std::cout << "The value is non-zero\n";
return 0;
}Lub tak:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
bool zero { (x == 0) };
if (zero)
std::cout << "The value is zero\n";
if (!zero)
std::cout << "The value is non-zero\n";
return 0;
}Oba te programy są bardziej złożone, niż powinny. Zamiast tego możemy użyć alternatywnej formy instrukcji if zwany if-else. If-else przybiera następującą formę:
if (condition)
true_statement;
else
false_statement;
Jeśli warunek określa wartość logiczną true, true_statement wykonuje. W przeciwnym razie false_statement wykonuje się.
Zmodyfikujmy nasz poprzedni program tak, aby używał if-else.
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x == 0)
std::cout << "The value is zero\n";
else
std::cout << "The value is non-zero\n";
return 0;
}Teraz nasz program wygeneruje następujące dane wyjściowe:
Enter an integer: 0 The value is zero
Enter an integer: 5 The value is non-zero
Łączenie instrukcji if
Czasami chcemy sprawdzić, czy kilka rzeczy jest po kolei prawdą, czy fałszem. Możemy to zrobić łącząc instrukcję if (lub if-else) z wcześniejszą if-else, na przykład:
#include <iostream>
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
if (x > 0)
std::cout << "The value is positive\n";
else if (x < 0)
std::cout << "The value is negative\n";
else
std::cout << "The value is zero\n";
return 0;
}Klasa operator mniej niż (<) służy do sprawdzania, czy jedna wartość jest mniejsza od drugiej. Podobnie, operator większego niż (>) służy do sprawdzania, czy jedna wartość jest większa od drugiej. Oba te operatory zwracają wartości logiczne.
Oto wynik kilku uruchomień tego programu:
Enter an integer: 4 The value is positive
Enter an integer: -3 The value is negative
Enter an integer: 0 The value is zero
Pamiętaj, że możesz łączyć instrukcje if tyle razy, ile masz warunków, które chcesz obliczyć. Zobaczymy w quizie przykład, w którym jest to przydatne.
Zwracane wartości logiczne i instrukcje if
W poprzedniej lekcji (4.9 -- Wartości logiczne), napisaliśmy ten program za pomocą funkcji zwracającej wartość logiczną:
#include <iostream>
// returns true if x and y are equal, false otherwise
bool isEqual(int x, int y)
{
return x == y; // operator== returns true if x equals y, and false otherwise
}
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
std::cout << "Enter another integer: ";
int y {};
std::cin >> y;
std::cout << std::boolalpha; // print bools as true or false
std::cout << x << " and " << y << " are equal? ";
std::cout << isEqual(x, y); // will return true or false
std::cout << '\n';
return 0;
}Ulepszmy ten program za pomocą instrukcji if:
#include <iostream>
// returns true if x and y are equal, false otherwise
bool isEqual(int x, int y)
{
return x == y; // operator== returns true if x equals y, and false otherwise
}
int main()
{
std::cout << "Enter an integer: ";
int x {};
std::cin >> x;
std::cout << "Enter another integer: ";
int y {};
std::cin >> y;
if (isEqual(x, y))
std::cout << x << " and " << y << " are equal\n";
else
std::cout << x << " and " << y << " are not equal\n";
return 0;
}Dwa uruchomienia tego program:
Enter an integer: 5 Enter another integer: 5 5 and 5 are equal
Enter an integer: 6 Enter another integer: 4 6 and 4 are not equal
W tym przypadku nasze wyrażenie warunkowe jest po prostu wywołaniem funkcji isEqual, która zwraca wartość logiczną.
Warunki inne niż boolowskie
We wszystkich powyższych przykładach nasze warunki warunkowe były albo wartościami boolowskimi (true lub false), zmiennymi boolowskimi, albo funkcjami zwracającymi wartość logiczną wartość. Co się stanie, jeśli wyrażenie warunkowe będzie wyrażeniem, którego wartością nie będzie wartość logiczna?
W takim przypadku wynik wyrażenia warunkowego zostanie przekonwertowany na wartość logiczną: wartości niezerowe zostaną przekonwertowane na wartość logiczną true, a wartości zerowe zostaną przekonwertowane na wartość logiczną false.
Dlatego jeśli zrobimy coś takiego:
#include <iostream>
int main()
{
int x { 4 };
if (x) // nonsensical, but for the sake of example...
std::cout << "hi\n";
else
std::cout << "bye\n";
return 0;
}To spowoduje print hi, ponieważ x ma wartość 4, I 4 jest wartością niezerową, która jest konwertowana na wartość logiczną true, co powoduje wykonanie instrukcji po warunku.
Kluczowa informacja
if (x) oznacza „jeśli x jest niezerowe/niepuste”.
Instrukcje if i wczesne zwroty
Instrukcja return, która nie jest ostatnią instrukcją w funkcja nazywa się wczesnym powrotem. Taka instrukcja spowoduje, że funkcja wróci do wywołującego po wykonaniu instrukcji return (zanim w przeciwnym razie funkcja wróci do wywołującego, a zatem „wcześniej”).
Bezwarunkowy wcześniejszy powrót nie jest przydatny:
void print()
{
std::cout << "A" << '\n';
return; // the function will always return to the caller here
std::cout << "B" << '\n'; // this will never be printed
}Ponieważ std::cout << "B" << '\n'; nigdy nie zostanie wykonany, równie dobrze możemy go usunąć, a wtedy nasza return instrukcja nie jest już wczesna.
Jednak w połączeniu z Instrukcje if, wcześniejsze zwroty umożliwiają warunkowanie wartości zwracanej przez naszą funkcję.
#include <iostream>
// returns the absolute value of x
int abs(int x)
{
if (x < 0)
return -x; // early return (only when x < 0)
return x;
}
int main()
{
std::cout << abs(4) << '\n'; // prints 4
std::cout << abs(-3) << '\n'; // prints 3
return 0;
}Po wywołaniu abs(4) x ma wartość 4. if (x < 0) jest fałszywe, więc wcześniejszy powrót nie zostanie wykonany. Funkcja zwraca x (wartość 4) do osoby wywołującej na końcu funkcji.
Po wywołaniu abs(-3) x ma wartość -3. if (x < 0) jest prawdą, więc wykonywany jest wcześniejszy powrót. Funkcja zwraca -x (wartość 3) do osoby wywołującej w tym momencie.
Historycznie rzecz biorąc, wczesne zwroty nie były mile widziane. Jednakże we współczesnym programowaniu są one bardziej akceptowane, szczególnie gdy można ich użyć do uproszczenia funkcji lub do wcześniejszego przerwania funkcji z powodu błędu.
Powiązana treść
Debatę na temat wczesnych zwrotów omawiamy w dalszej części lekcji 8.11 — Przerwij i kontynuuj
Będziemy kontynuować badanie instrukcji if w przyszłej lekcji 8.2 -- Instrukcje i bloki if.
Czas quizu
Pytanie nr 1
Co to jest wczesny powrót i jakie jest jego znaczenie zachowanie?
Pytanie nr 2
Liczba pierwsza to liczba całkowita większa od 1, którą można podzielić równo tylko przez 1 i samą siebie. Napisz program, który poprosi użytkownika o wprowadzenie liczby od 0 do 9 (włącznie). Jeśli użytkownik wprowadzi liczbę z tego zakresu, która jest liczbą pierwszą (2, 3, 5 lub 7), wydrukuj „Cyfra jest pierwsza”. W przeciwnym razie wydrukuj „Cyfra nie jest pierwsza”.
Pytanie nr 3
Jak można zmniejszyć długość następującego kodu (bez zmiany formatowania)?
#include <iostream>
bool isAllowedToTakeFunRide()
{
std::cout << "How tall are you? (cm)\n";
double height{};
std::cin >> height;
if (height >= 140.0)
return true;
else
return false;
}
int main()
{
if (isAllowedToTakeFunRide())
std::cout << "Have fun!\n";
else
std::cout << "Sorry, you're too short.\n";
return 0;
}
