Deklarowanie jawne i niejawne

0

Czym się różni deklarowanie jawne od niejawnego? Chodzi o to że int a = 4 to deklarowanie jawne, a string = a to już niejawne?

0

W C++ nie ma deklaracji niejawnej.

0

A w innych językach?

0

Na przykład w PHP pierwsze użycie niezadeklarowanej zmiennej automatycznie ją utworzy z domyślną wartością.

0

A jak zrobić niezadeklarowaną zmienną? To takie coś jak var w c#?

0

Tyle, że tam nie ma żadnych przykładów i nadal nie wiadomo o co chodzi.

0

Po prostu, w niektórych językach nie ma deklaracji typu czy choćby słówka var. Chcesz przykład? Proszę:

a = 1
2

Proszę bardzo, przykład w PHP, z deklarowaniem jawnym:

$zmienna1 = "Hi!";
echo $zmienna1;
echo $zmienna2;

To wyświetli nam wartość zmiennej zmienna1, czyli "Hi!".
Zmienna zmienna2 również powinna zostać wyświetlona, ale... taka zmienna nie istnieje, więc jest użyta wartość domyślna, co właśnie nazywa się deklaracją niejawną.

Jaka jest ta wartość domyślna? Nie mam pojęcia niestety, nie było mi to nigdy potrzebne.

0

@twonek @ShookTea
Dwóch na jednego, marne moje szanse. Chyba, że jakiś forumowy mózg się zlituje ;)

Nie pozostaje mi nic innego jak poszukać Wam jakiejś lektury do poczytania, bo przekrzyczeć Was nie przekrzyczę.

Na początek polecam dokumentację VB - można tam stosować oba sposoby, więc ładnie widać różnicę:
https://msdn.microsoft.com/library/xe53dz5w(v=vs.100).aspx

1

@Maciej Cąderek skoro postanowiłeś rzucić jakimś źródłem zamiast wycieczek personalnych, to opiszę Ci to dokładniej.

a = 1

Tak jak napisałem, przykład dałby się podciągnąć pod niejawną deklarację, ale nie jest najlepszy, bo w niejawnej deklaracji bardziej chodzi o użycie takiej zmiennej niż inicjalizację. Przykład @ShookTea lepiej pokazuje, jak zmienna2 nie została zadeklarowana, a jest użyta. Twój przykład równie dobrze może być jawną deklaracją w jakimś języku z dynamicznym typowaniem.

Natomiast ten komentarz

w niektórych językach nie ma deklaracji typu czy choćby słówka var
jest bez sensu i wprowadza w błąd, bo to czy podajemy typ czy nie przy deklaracji bardziej podchodzi pod zagadnienie typowania. Przykład @ShookTea właśnie to pokazuje, jak PHP nie potrzebuje typu przy deklaracji zmiennej.

Zauważ, że np w C# zmienna zadeklarowana z var to **implicit typed** variable, czyli obecność var nie sprawia że coś jest explicit.

0

@twonek

No ok, pehap jest dosyć liberalny w tej kwestii, rzeczywiście wyrzuca błędy tylko na poziomie notice. Natomiast nijak się ma to do istoty dyskusji, moja wypowiedź dla przypomnienia:
"Nie ma wartości domyślnej, interpreter rzuci błędem. Obie deklaracje są niejawne."

Pierwsza część mojej wypowiedzi była błędna, php przypisuje domyślną wartość null. Druga pozostaje w mocy (zresztą te dwa zdania były sprzeczne, mogłem zauważyć).

Jeszcze raz przytoczę cytat z Wiki:

Deklaracje niejawne występują w językach programowania, które umożliwiają użycie identyfikatora bez jego jawnej deklaracji. W tym przypadku translator musi posiadać mechanizm przypisania do identyfikatora atrybutów na podstawie określonych metod:

  • domyślnej
  • niejawnej
  • kontekstowej

Deklaracje niejawne mogą prowadzić do błędów, np. błąd literowy w identyfikatorze spowoduje utworzenie nowej zmiennej, a tym samym błąd w działaniu programu.

$a; // deklaracja niejawna, przypisanie atrybutów oparte na metodzie domyślnej
$b = 1; // deklaracja niejawna, przypisanie atrybutów oparte na metodzie kontekstowej

Ok, zostawmy php, przejdźmy do pythona - zacytowałeś mi taki fragment (btw nie wiedzieć czemu link skasowałeś -> http://www.sitepoint.com/typing-versus-dynamic-typing/):

Dynamic Typing

Dynamic typed programming languages are those languages in which variables must necessarily be defined before they are used. This implies that dynamic typed languages do not require the explicit declaration of the variables before they’re used. Python is an example of a dynamic typed programming language, and so is PHP. Consider the following example:

/* Python code */ 
num = 10 // directly using the variable

Dodatkowo choćbyś nawet chciał, to kodu pythona bez przypisania wartości nie skompilujesz, za co mu chwała (no chyba, że porobisz wszędzie wyjątki) -> http://ideone.com/YSuzQZ
Python posiada tylko niejawne deklaracje z przypisaniem atrybutów opartym na metodzie kontekstowej (idąc za definicją z wiki).

twonek napisał(a):

@Maciej Cąderek skoro postanowiłeś rzucić jakimś źródłem zamiast wycieczek personalnych, to opiszę Ci to dokładniej.
Natomiast ten komentarz

w niektórych językach nie ma deklaracji typu czy choćby słówka var
jest bez sensu i wprowadza w błąd, bo to czy podajemy typ czy nie przy deklaracji bardziej podchodzi pod zagadnienie typowania. Przykład @ShookTea właśnie to pokazuje, jak PHP nie potrzebuje typu przy deklaracji zmiennej.

Zauważ, że np w C# zmienna zadeklarowana z var to **implicit typed** variable, czyli obecność var nie sprawia że coś jest explicit.

Co do C# i var - tak, też zauważyłem tą niejasną terminologię, moim zdaniem jest to mylące - mówią tam o tym w zupełnie innym kontekście, niż w przypadku podlinkowanej dokumentacji VB - w kontekście niejawnego nadania typu, a nie niejawnej deklaracji zmiennej (czyżby ktoś mi to niedawno zarzucał? widać jak Ci akurat wygodnie, tak piszesz - nieładnie).

No i skoro już przy tych typach jesteśmy, jak ja to rozumiem na podstawie przytoczonych źródeł:

  • każda zmienna zadeklarowana jedynie przez zainicjowanie wartości to zmienna zadeklarowana niejawnie - tak jest wprost napisane w źródłach, jest dla mnie sensowne,

  • dodatkowo zmiennymi zadeklarowanymi niejawnie są też, w niektórych językach typowanych dynamicznie (np. php), zmienne nie zainicjowane w ogóle - o ile dany język zapewnia mechanizm przypisywania domyślnego typu,

  • jeśli dwa powyższe stwierdzenia są poprawne i wyczerpują temat to wszystkie pozostałe metody deklarowania zmiennych (nie typów!) są deklaracjami jawnymi - stąd moje stwierdzenie, że każda zmienna, która przy deklaracji wymaga podania typu lub słowa kluczowego wskazującego na miejsce deklaracji zmiennej jest zmienną deklarowaną jawnie (jeszcze raz powtarzam - nie mylę jawnej deklaracji typu z jawną deklaracją zmiennej, ale twierdzę, że nie da się zadeklarować zmiennej jawnie bez użycia deklaracji typu lub słowa kluczowego).

To co namacalnie wyróżnia zmienne deklarowane jawnie od tych deklarowanych niejawnie to to, że kompilator / interpreter w przypadku tych pierwszych nie zezwoli nam na samo przypisanie wartości do zmiennej.

PS
Myślę, że temat został wyczerpany z mojej strony, szczerze polecam Ci nie brnąć dalej, bo się pogrążysz, ale śmiało.

0

No to ja może zacznę od końca:

Myślę, że temat został wyczerpany z mojej strony, szczerze polecam Ci nie brnąć dalej, bo się pogrążysz, ale śmiało.
Nie mam problemu z przyznaniem się do błędu, ludzie którzy wytykali mi błędy w moich postach wiedzą o tym (co też zaraz uczynię). Natomiast nie lubię obcować z "wszystko wiedzącymi", więc skoro tak grzecznie prosisz, to obiecuję, że to będzie mój ostatni post w tym temacie.

Obie deklaracje są niejawne.
Przyznam, że nie byłem w stanie znaleźć jednoznacznego źródła, które by twierdziło, że to jest nieprawdą. Dopuszczam więc możliwość, że masz rację i PHP pozwala tylko na niejawne deklaracje. Niemniej nie uznam tego za fakt, dopóki Ty nie pokażesz mi jednoznacznego źródła potwierdzającego. Własna interpretacja wiki takim źródłem nie jest.

btw nie wiedzieć czemu link skasowałeś
Ze względu na sarkastyczny ton tamtego zdania.

This implies that dynamic typed languages do not require the explicit declaration of the variables before they’re used.
No i czego to dowodzi? Dalej w tym samym artykule masz przykład jak dynamicznie typowany Perl wymusza jawną deklarację zmiennej przed użyciem.

każda zmienna, która przy deklaracji wymaga podania typu lub słowa kluczowego wskazującego na miejsce deklaracji zmiennej jest zmienną deklarowaną jawnie
Tak. Ale to nie implikuje, że jeżeli nie ma typu to musi być zmienną deklarowaną niejawnie.

0

Nie sądzę, żebym był w stanie pokazać Ci źródło, które chociażby mnie, a co dopiero Ciebie usatysfakcjonuje, zresztą nie to było moim celem (choć jak mi coś ciekawego wpadnie w łapy, to podeślę). To Ty sugerowałeś jakobym nie wiedział co piszę, więc starałem się pokazać, że to co uważałeś za takie oczywiste tak oczywiste nie jest, co mam nadzieję mi się udało. Przynajmniej dużo Ciekawych rzeczy poczytałem i nauczyłem się kilku rzeczy, ale raczej nie dowiedziałem się nic, co by zasadniczo zmieniło moje postrzeganie tego konkretnego tematu. Czas uznaję za pożytecznie zmarnowany :D

0

@Maciej Cąderek panie, zrozum pan, deklaracja niejawna jest wtedy, gdy zmienna nie jest deklarowana przez programistę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1