a)
Rozumiem to jako takie podrobienie pętli for |
int licznik = 0;
while( 1 )
{
licznik++;
if( licznik == 10 )
break;
}
Tak, coś takiego możesz porównać do podróbki pętli for. Założeniem tego przykładu było pokazać jak działa break, ale faktycznie jest to coś jak
for( int licznik = 0; licznik < 10; licznik++ )
- licznik równy zero, wykonujemy dopóki licznik jest mniejszy lub równy 10 (w przykładzie z if'em: przerwij (break;) kiedy licznik jest równy 10)
Reasumując - jest tak jak mówisz. Pętla while(1) będzie się wykonywać w nieskończoność. Ale w jej ciele jest if, który wywołuje instrukcje break która przerywa pętle.
mnie uczono na forum, żeby mówić "instrukcja", ale to tylko pierdółka.
b)
nawiązując do pierwszego pytania, czyli gdyby było: while( 0 ) { } pętla w ogóle by się nie wykonała? Mam tu pewien konflikt: raz tłumaczę to sobie "wykonuj coś tam dopóki fałsz będzie fałszem" - zawsze, a raz "wykonuj coś tam dopóki (fałsz) będzie prawdą" - nigdy. Bardziej jednak skłaniam się ku drugiej filozofii - jednak tu też prosiłbym Cię o potwierdzenie. |
Hmm... Może niezbyt jasno to wytłumaczyłem. W nawiasach if'a, pętli while oraz pętli do...while jest jakiś warunek, np:
Przed każdym powtórzeniem ten warunek jest sprawdzany w ten sposób:
czy a jest równe 5?
Jeśli tak, zwraca true
Jeśli nie, false i pętla się kończy.
Skoro wpisujesz tam liczby 0 lub 1 (albo false/true - też tak możesz, bo przecież te liczby im odpowiadają) to warunek jakby jest podany na tacy - skoro prawda, to prawda! Jak fałsz, to fałsz.
To faktycznie trochę niejasne, ale myślę, że zrozumiesz :)
Jako formułkę wybierz sobie najlepiej to co napisałem - sprawdza warunek, a jeśli warunkiem jest 0/1 false/true to nic nie musi sprawdzać. Bo przecież coś takiego a==5 też ma wartość prawda lub fałsz - w zależności od tego jaką wartość ma 'a'. W każdym razie, pętla while(0) lub while(flase) się nie wykona.
c)
wracając do zer i jedynek oraz do tablic, uczono mnie że przy tworzeniu tablic np. tablica[ 10 ] możemy do nich dopisać = { x } gdzie "x" będzie wartością neutralną - wspólną początkową wartością dla WSZYSTKICH "x-ów" w tej tablicy |
Nie wiem kto Cię tego uczył, ale nie, tak nie jest :D
Może tak było kiedyś a masz starą książkę, ja uczę się od pół roku więc nie jestem tak obeznany w starych standardach. Aczkolwiek teraz musisz pisać w ten sposób:
int tab[ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
Jeśli wszystkie mają mieć wartość 5 to:
int tab[ 10 ] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
Jeśli masz ogromną tablicę, to robisz tak:
const int rozmiar = 900000
int tab[ rozmiar ];
for( int i = 0; i < rozmiar; i++ )
{ tab[ i ] = 5; }
Co to za zmienna
const int
zapytasz. Const oznacza, że po stworzeniu takiej zmiennej musimy od razu nadać jej wartość (chyba, że nie chcemy), w przeciwnym wypadku potem będzie to nie możliwe:
Ale po co jej użyłem? Cóż, spójrz na rozmiar tablicy - 900000. Wiesz, jak łatwo się pomylić kiedy musisz takiej liczby używać właśnie w pętlach itp? Dzięki temu mamy pewność, że się nie pomylimy, a const chroni przed zmianami.
Jest to tylko wartość początkowa dla 1. (0) tablicy |
Tak. tab[10]={1,2,3}; - tylko dla trzech pierwszysch elementów (tab[0], tab[1] i tab[2])
Dlaczego zatem w tym działającym programie gdzie mamy bool z[ 10 ] = { 0 } jakoś wszystkie te zmienne logiczne mają wartość 0 (false)? |
Kompilator MUSI coś do nich wstawić. Nie może być zmiennej bez wartości. Tak samo jest z int'em. Na takie wartości mówi się "śmieci", bo są to pozostałości w pamięci. Uruchom ten program:
#include <iostream>
using namespace std;
int main()
{
int tab[ 10 ];
for( int i = 0; i < 10; i++ )
cout << "to sa wlasnie smieci, tab[" << i << "] : " << tab[ i ] << endl;
}
Tak więc kompilator po prostu "powstawiał" sobie w elementy tablicy bool false. Dlaczego? Myślę,że to domyślne. Ale Tobie radzę zawsze określić w programie
bool a = false;
Ja tak robie, myślę, że inni też. Chyba, że nie potrzebujesz od razu jej używać, a przyjmować będzie ona jakąś wartość i dopiero potem będzie wykorzystywana.
Chyba że, w C++ każda stworzona nowa obojętnie jakiego typu zmienna jest jest od początku "niczym" - zerem |
Tak jak wspomniałem są tam śmieci, chyba, że takie liczby zadeklarujesz przed funkcją main() - ale wiele osób odradza tworzenia takich zmiennych, tzw. globalnych. Myślę, że to dlatego, że są one widoczne potem w innych plikach naszego programu i mogą przeszkadzać, szczególne takie o nazwie rozmiar/size itp., bo są często używane. W każdym razie zmienne tworzone poza funkcją main są zawsze inicjalizowane przez kompilator zerami, uruchom ten program:
#include <iostream>
using namespace std;
int tab[ 10 ];
int main()
{
for( int i = 0; i < 10; i++ )
cout << "nad main() - smieci brak tab[" << i << "] : " << tab[ i ] << endl;
}
Tak więc:
w main() - śmieci.
Poza main() - zera
d)
takie małe czysto kosmetyczne pytanie - rozumiem zatem, że w C++ mogę zamiennie korzystać z false=0 i true=1 w przypadku wartości logicznej bool ? Jeżeli tak to czy jest możliwe aby zapisać wartość 1 dla "x-a", który jest zmienną typu "int" tak: x = true;? |
No dobra, tym trochę mnie zbiłeś z tropu :D
Myślałem, że 1 = true, ale nie można sobie wstawić true do int'a.
A tu proszę, niespodzianka:
#include <iostream>
using namespace std;
int main()
{
int a = true;
cout << a;
}
Więc wszystkie znaki na niebie i ziemi mówią, że można, chociaż ja bym tego nie robił, i do prawdy/fałsza używał bool'a, a do liczb int'a, bo kiedyś w dużym programie się pogubisz, a kompilator nie uzna Ci tego jako błędu, więc będziesz szukał i szukał, a uwierz mi, nie ma chyba niczego gorszego.
Jakbyś czegoś jeszcze nie rozumiał, to pytaj, po to jest to forum :)
I programistycznego 2017 :))