zmienna jest używana na zewnątrz do/while (w języku C# na Curlies zazwyczaj określają zakres), a ponieważ jest zadeklarowana wewnątrz do-while, nie można go używać poza tym zakresem.
Możesz to naprawić, po prostu deklarując je poza pętlą.
int composite = 0; // you are not required to set it to zero, as long
// as you do not use it before you initialize it
do
{
index += index;
composite = index + 1;
// more code here
} while (UnsetBitmask(bitmasks, composite));
Uwaga (1), powszechną praktyką jest zadeklarować i ustawić zmienną za jednym zamachem, ale nie jest to wymóg, tak długo, jak ustawić go przed użyciem.
Uwaga (2): w języku C#, nawiasy klamrowe {....}
definiują zakres zmiennych. Nie można używać zmiennej spoza jej zakresu, nie jest ona już "widoczna", w rzeczywistości, gdy wykracza poza zakres, jest gotowa do zbierania śmieci, a jej zawartość może być niezdefiniowana.
i konw tego, ale dlaczego kompilator nie mogę zrobić tego
Pytałeś to w komentarzach. Odpowiedź jest mniej trywialna, niż mogłoby się wydawać. To zależy w dużej mierze od definicji języka. Niektóre języki, takie jak Perl lub starsze BASIC, pozwalają na deklarowanie zmiennych na dowolnym poziomie iw dowolnym zakresie. Inne języki pozwalają na ustalanie zakresów zmiennych i wymagają deklarowania zmiennych przed ich użyciem (C#, Java, C++, Python). Zazwyczaj, ale niekoniecznie, jest to typowe dla statically typed languages, ponieważ kompilator musi wcześniej wiedzieć, jaki typ danych ma zostać umieszczony w zmiennej, aby dokonać sprawdzenia typu:.
Jeśli kompilator wymusiłby deklarację, ale nie zakres, oznacza to, że wszystkie zmienne miałyby charakter globalny, co jest trudne w przypadku większych programów, ponieważ jako programista trzeba zachować tam, gdzie użyto nazw zmiennych i zachować wyjątkowość . To bardzo uciążliwe (myśl COBOL).
C# dodało słowo kluczowe dynamic
, które pozwala na wprowadzanie zmiennych o dynamicznym typie, ale to nadal wymaga zdefiniowania zmiennej przed jej użyciem.
Kompilator może to zrobić, ale projektanci C# zdecydowały, że jasny język jest lepszy, i ich zdaniem zadeklarowanych zmiennych are a good thing, ponieważ zapobiega fałszywych błędów i niemożliwe do wykonania kodu:
// can you see the problem?
va1l = 1;
val1 = 2;
vall = va1l + vall;
Wymuszenie deklarowania zmiennych i ich zakresów zapobiega tym i powiązanym rodzajom błędów.
Sprawdź zakres zmiennych. "kompozyt" istnieje tylko w zasięgu pętli do wykonania, a nie poza nią. – Brandon
i konw this, ale dlaczego kompilator nie może tego zrobić? –
Dlaczego * powinna * zmienna poza zakresem może być użyta poza jej zakresem? Byłby to błąd, gdybyś mógł to zrobić. –