Programátorská hádanka

Tomáš Herceg       3. 6. 2008       VB.NET       7096 zobrazení

Není to nic těžkého, ale co udělá tento jednoduchý kód? Co bude v proměnných a a b?

             Dim a, b As Boolean

'nastavit a, b
'...

a = b = False

Věřím, že ti, co používají VB.NET budou vědět. Ti, co ho neznají, se možná budou divit. Kdo napíše správnou odpověď do diskuse, má u mě malé bezvýznamné plus.

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: Programátorská hádanka

Po testech jsem dosel k zaveru:

dim a0,a1, ... ,aN as boolean

a0=a1=a2 je ekvivalent a0=(a1=a2)

a0=a1=a2=a3 je ekvivalent a0=((a1=a2)=a3)

a0=a1=a2=a3=a4 je ekvivalent a0=(((a1=a2)=a3)=a4)

a0=a1=a2=a3=a4=a5 je ekvivalent a0=((((a1=a2)=a3)=a4)=a5)

a tak dal az po aN

s pozdravem Bob

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Programátorská hádanka

Tady je vidět další z rodílů C# a Visual Basic. Ve VB nemusí tolik přemýšlet (jeden druh závorek, žádná dvojitá rovnítka atp.). V C# by byl zápis jednoznačný:

a = b == false

Ale opět jde o to, že se VB učí rychleji, protože začátečník to nemusí řešit.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Oproti C# je to však nevýhoda v tom, že nelze udělat vícenásobné přiřazení hodnoty. a = b = c = d = true; by v C# znamenalo, že všechny uvedené proměnné se budou rovnat hodnotě true. Ve VB.NET by se to muselo napsat a = True: b = a: c = a: d = a což je nepraktické. Tím však nechci vychvalovat C#...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je pravda, daleko víc mě to ale štve například když mám funkci, která vrací nějakou hodnotu a já potřebuji něco provádět, dokud tu hodnotu vrací, ale zároveň tu hodnotu potřebuji. V C# můžu napsat třeba

while ((prom = Funkce(parametry)) > 0) něco

To ve VB.NET prostě nejde. Zorvna včera mě tak napdlo, že by do VB.NET mohli přidat operátor == právě na tuhle věc, přiřazení, které vrací tu přiřazovanou hodnotu. Pak by se dala napsat i předchozí konstrukce a == b == c. Někdo může namítat, že by se tím nadělal zmatek, na druhou stranu tohle se nepoužívá tak často a podle mě je naprosto logické na běžně používané operace používat krátké operátory a na speciální věči může být operátor delší. Člověk taky pozná, jestli se porovnává, nebo přiřazuje, proč by to tedy musel explicitně říkat kompilátoru? Ale to je jen takový nápad.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Člověk taky pozná, jestli se porovnává, nebo přiřazuje, proč by to tedy musel explicitně říkat kompilátoru?

Porovnání a přirazení jsou dvě rozličné věci. Proto mají na to některé jazyky dva operátory, aby nedocházelo k nejasnostem jaké jste napsal v článku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To nejsou nejasnosti, ve specifikaci jazyka Visual Basic .NET je to přímo takto zadefinované. Jediné možné přiřazování má tvar cíl = výraz anebo For cíl = hodnota... . První rovná se je tedy operátor přiřazení, ve všech ostatních případech (tzn. While, If, výraz atd.) jde o porovnávání. Bohužel o tomhle všichni neví, a tak na to v článku upozorňuji. Rozhodně na tom není nic nejasného, naopak je to velice přirozené. Je to ale samozřejmě hlavně věc zvyku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

resp. fuj, to je prasárna. :)

a stejně mě to programování nebaví. :)

nahlásit spamnahlásit spam -4 / 4 odpovědětodpovědět

Diskutujte, pokud máte něco k věci. Příspěvky se posílají, když mají nějaký přínos, ne jen proto, abyste je poslal.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve VB nemusí tolik přemýšlet (jeden druh závorek, žádná dvojitá rovnítka atp.)

S tím bych nesouhlasil. V C# jsou operátory = a == jasně definované a mají vždy stejný význam. Ve VB = občas znamená přiřazení, občas porovnání podle kontextu. A rozhodování se podle kontextu mi přijde o trochu pomalejší, než prostý pohled na operátor.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na druhou stranu se jedná spíše o výjimečné situace, kdy na jednom řádku napíšeš vb VB.NET přiřazení a porovnávání zároveň.

U Ifu je prostě jasné, že se porovnává, a když na řádku uvidíš a = něco, tak je taky jasné, že to nebudeš porovnávat, ale že jde o přiřazení. Je to prostě o zvyku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já nemluvím o programátorech expertech, ale o začátečnících. Pro ně je těžké rozlišit funkci bez parametrů a vlastnost. Oni chtějí porovnávat znakem =, nechápou rozdíl od ==. Nechápou !=, líbí se jim <>. Proto se tak hezky učí a i laik se v něm může zorientovat. A se základy se člověk dostane lépe dál.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Programátorská hádanka

Obě proměnné budou negativní?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vskutku zajímavá hádanka, příště se poradím s kompilátorem než něco plácnu :).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Programátorská hádanka

No v a by melo byt TRUE

pokud se nepletu melo by se to cist nejak takto

rovna se b False vysledek vrat do promenne a

no a jelikoz vychozi Boolean hodnota je False tzn b=False =TRUE

Kurnik, snad se nepletu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nějak tak. Ve skutečnosti se výraz a = b = False chová úplně stejně jako a = Not b.

První rovnítko je totiž operátor přiřazení, do proměnné a tedy přiřazujeme to, co je za ním, čili výraz b = False. To druhé rovná se ale už není přiřazení, nýbrž porovnání. Proto tedy VB porovná hodnoty v b s False a pokud se rovnají, do a přiřadí True. V opačném případě, tedy pokud v b je True, přiřadí do proměnné a hodnotu False.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jenom ještě doplňuji, že vyhodnocení výrazu a = Not b je daleko rychlejší, nepotřebuje totiž porovnání.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback